显然的条件:必须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;
}
作者:夕林山寸