SGU 142 Keyword(水~)

来源:互联网 发布:明阳智慧能源知乎 编辑:程序博客网 时间:2024/05/17 08:21

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 555555int 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;}
0 0
原创粉丝点击