[题解]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;  
}  
posted @ 2024-06-25 12:27  WBIKPS  阅读(31)  评论(0)    收藏  举报