CTU Open Contest 2019 G. Beer Mugs 异或维护奇偶性

Dior ·
更新时间:2024-11-15
· 609 次阅读

显然的条件:必须L-R中 字符个数最多一个是奇数,其他必须是偶数

由于奇偶性可以用异或表示,区间L,R的奇偶性等于区间1,R异或区间1-(L-1)。

所以 这是个经典的解法:枚举以R为区间右端点,先求出1-R中间的字符数量的奇偶关系。

然后让所有字符全偶,且最左边的位置id,与ans取max。

然后枚举每个字符,令这个字符是奇数,其他是偶数即查询状态(tp ^ (1<<j) )的最早出现的位置。

比赛的时候想的是前缀和维护,虽然是一样的思路但写了80行,导致没调出来。。。

#include using namespace std; typedef long long ll; #define ls (o<<1) #define rs (o<<1|1) #define pb push_back //#define a(i,j) a[(i)*(m+2)+(j)] //m是矩阵的列数 const int M = 3e5+7; const int N =(1<>n>>(s+1); memset(mp,0x3f,sizeof(mp)); int tp=0,ma=0; //cout<<"ok"<<endl; mp[0]=0; for(int i=1;i<=n;i++) { int ch=s[i]-'a'; tp^=(1<<ch); //print(tp); ma=max(ma,i-mp[tp]);//全是偶数 for(int j=0;j<20;j++) { ma=max(ma,i-mp[tp^(1<<j)]);//除了j 其他都要是偶数 // cout<<i<<" "<<(tp^(1<<j))<<" "<<mp[tp^(1<<j)]<<" "<<ma<<endl; } mp[tp]=min(mp[tp],i);//状态tp的位置 最左边的位置 } cout<<ma<<endl; return 0; }
作者:夕林山寸



contest 奇偶性 open 异或

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章