[题解]CF1791D Distinct Split

题意

定义函数 f(x) 表示字符串 x 中不同字符的数量。

现给定一个字符串 S,将它分割为两个字符串 a,b。求出:max(f(a)+f(b))

思路

我们可以搞一个前缀和 a 和一个后缀和 b,分别表示 f(S1Si)f(SiSn)

然后枚举分界点即可。

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;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18266706

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示