符合条件的串:最多只能有一个字符出现次数是奇数次 设置一个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'; }