Description
给出一个只由a和b组成的长度为n的字符串,求没在这个字符串的子串中出现的最短的由a和b组成的串
Input
第一行一个正整数n表示串长,第二行一个字符串(1<=n<=500000)
Output
输出没在该串的子串集中出现过的最短的串
Sample Input
11
aabaaabbbab
Sample Output
4
aaaa
Solution
将a和b看作01,长度不大于m的由a和b组成的串有2^m-1种,而一个长度为n的串至多有n-m+1个长度为m的子串,故m最多不超过20,将一个串看作一个整数的二进制表示(a表示0,b表示1),那么只需要开一个2^20的数组标记输入的串中长度不超过20的子串即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 555555
int n,ans[22],flag[1<<21],res;
char s[maxn];
int main()
{
memset(flag,0,sizeof(flag));
scanf("%d%s",&n,s);
for(int i=0;i<n;i++)
{
int temp=1;
for(int j=i;j<i+20&&j<n;j++)
{
temp=2*temp+s[j]-'a';
flag[temp]=1;
}
}
for(int i=2;i<1<<20;i++)
if(!flag[i])
{
res=0;
while(i)
{
ans[res++]=i&1;
i>>=1;
}
printf("%d\n",res-1);
for(int j=res-2;j>=0;j--)printf("%c",ans[j]+'a');
break;
}
return 0;
}