J-JuPaels Palindrome
题意:
给定一个长度为n的字符串s,要求选定一个区间,可以重排字符。求出最长的可以回文的子串
思路:
考虑每个字符的奇偶性。显然当区间长度为偶数时,每种字符的数量为偶。区间长度为奇数时,只有一种字符的数量为奇
将[1,x]中26个字符的数量,奇数为1,偶数为0,则可以压缩成范围在[1,1<<26)的数字状态
从左往右遍历,当在r遇到的状态之前在l遇到过,说明这段区间([l+1,r])满足所有字符均为偶数
为了转移得到奇数情况
可以在遇到每个状态后,遍历26个字符将其异或,若之前存在状态则满足区间只有一种数是奇数
int a[1<<26];
int cnt[26];
void solve(){
int n;cin>>n;
string s;cin>>s;
s=" "+s;
int ans=0;
int k=0;
memset(a,-1,sizeof a);
a[k]=0;
rep(i,1,n){
k^=(1ll<<(s[i]-'a'));
for(int j=0;j<26;j++){
int u=k^(1ll<<j);
if(a[u]!=-1){
ans=max(ans,i-a[u]);
}
}
if(a[k]!=-1){
ans=max(ans,i-a[k]);
}else a[k]=i;
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号