枚举长度+hash,可以知道长度不会超过log(n),所以复杂度是nlog(n), 10^7次方竟然62ms过了 >.<
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
bool flag[1100005];
int pow[25];
char s[500005],output[500005];
int ss[500005];
int main()
{
int i,j,k,n,cnt,h;
pow[0]=1;
for(i=1;i<=20;++i)
pow[i]=pow[i-1]*2;
scanf("%d",&n);
scanf("%s",s);
for(i=0;i<n;++i)
{
if(s[i]=='a')
ss[i+1]=1;
else
ss[i+1]=0;
}
for(i=1;i<=n;++i)
{
memset(flag,false,sizeof(flag));
h=0;cnt=0;
for(j=1;j<=i;++j)
h=h*2+ss[j];
flag[h]=true;cnt++;
for(;j<=n;++j)
{
h=h*2+ss[j];
h%=pow[i];
if(!flag[h])
{
flag[h]=true;
cnt++;
}
}
if(cnt!=pow[i])
break;
}
printf("%d\n",i);
for(j=0;j<pow[i];++j)
{
if(!flag[j])
break;
}
for(k=i-1;k>=0;--k)
{
if(j%2==1)
output[k]='a';
else
output[k]='b';
j>>=1;
}
output[i]='\0';
printf("%s\n",output);
return 0;
}