码迷,mamicode.com
首页 > 其他好文 > 详细

状态压缩——2019 CTU G

时间:2020-02-23 13:09:34      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:mask   main   define   name   col   size   int   names   mem   

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

 

状态压缩——2019 CTU G

标签:mask   main   define   name   col   size   int   names   mem   

原文地址:https://www.cnblogs.com/zsben991126/p/12349276.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!