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;
}
posted @ 2025-05-28 22:28  Marinaco  阅读(21)  评论(0)    收藏  举报
//雪花飘落效果