[题解]CF1791D Distinct Split
题意
定义函数 \(\operatorname{f}(x)\) 表示字符串 \(x\) 中不同字符的数量。
现给定一个字符串 \(S\),将它分割为两个字符串 \(a,b\)。求出:\(\max(\operatorname{f}(a) + \operatorname{f}(b))\)。
思路
我们可以搞一个前缀和 \(a\) 和一个后缀和 \(b\),分别表示 \(\operatorname{f}(S_1 \sim S_i)\) 和 \(\operatorname{f}(S_i \sim S_n)\)。
然后枚举分界点即可。
Code
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N = 2e5 + 10,M = 230;
int T,n;
int arr[N],brr[N];
string s;
bool vis[M];
int main(){
cin >> T;
while (T--){
int ans = 0;
memset(arr,0,sizeof(arr));
memset(brr,0,sizeof(brr));
memset(vis,false,sizeof(vis));
cin >> n >> s;
s = ' ' + s;
for (re int i = 1;i <= n;i++){//前缀和
if (!vis[s[i]]){
arr[i] = arr[i - 1] + 1;
vis[s[i]] = true;
}
else arr[i] = arr[i - 1];
}
memset(vis,false,sizeof(vis));
for (re int i = n;i;i--){//后缀和
if (!vis[s[i]]){
brr[i] = brr[i + 1] + 1;
vis[s[i]] = true;
}
else brr[i] = brr[i + 1];
}
for (re int i = 0;i <= n;i++) ans = max(ans,arr[i] + brr[i + 1]);//选出 max
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号