状态压缩——2019 CTU G

符合条件的串:最多只能有一个字符出现次数是奇数次 
设置一个26位状态表示 字符i出现情况:0出现偶数次|1出现奇数次
i:0->n-1 求出s[0..i]所代表的状态mask, 设满足条件的一个前缀s[0..pre]的状态是mask1
    那么 count(mask^mask1)<=1
所以只要把mask每位轮流异或一个1,然后把状态用pre[]存起来,pre[i]表示状态i最早出现的位置 
*/
#include<bits/stdc++.h>
using namespace std;
#define N 1000005

int n;
char s[N];
int pre[1<<26];

int main(){
    cin>>n>>(s+1);
    int mask=0,ans=0;
    memset(pre,-1,sizeof pre);
    pre[mask]=0;
    for(int j=0;j<26;j++)
        if(pre[mask^(1<<j)]==-1)
            pre[mask^(1<<j)]=0;
             
    for(int i=1;i<=n;i++){
        mask^=(1<<(s[i]-'a'));
        
        if(pre[mask]!=-1)
            ans=max(ans,i-pre[mask]);
        else pre[mask]=i;
                
        for(int j=0;j<26;j++)
            if(pre[mask^(1<<j)]==-1)
                pre[mask^(1<<j)]=i; 
    }
    cout<<ans<<'\n';
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12349276.html