您的位置:首页 > 其它

POJ2752 Seek the Name, Seek the Fame(KMP)

2015-10-02 14:30 302 查看
给出一个字符串,求所有公共前后缀的长度。

如:ababcababababcabab的公共前缀后缀:ababcababababcabab,ababcabab,abab,ab,我们不难发现,在每个公共前后缀的都包含了比他更短的公共前后缀(可能字符串本身除外)

因此,我们只需要求一次next值,next[i]表示str[0,i-1]中公共前后缀的长度。如果str[i-1]==str[next[i-1]],显然next[i]=next[i-1]+1,否则又变成了求str[0,next[i-1]]中前后缀的子问题。

#include<cstdio>
#include<cstring>
#define MAXN 800010
using namespace std;
char a[MAXN];
int len,Next[MAXN],ans[MAXN],cnt;
int KMP(int llen)
{
int i,j;
memset(Next,0,sizeof Next);
Next[0] = -1;
for(i = 1; i <= llen; i++)
{
j = Next[i-1];
while(j != -1&&a[i-1] != a[j]) j = Next[j];
Next[i] = j+1;
}
return Next[llen];
}
int main()
{
while(scanf("%s",a) != EOF)
{
memset(ans,0,sizeof ans);
cnt = 0;
len = strlen(a);
//for(int i = 0; i < len; i++) a[i+len] = a[i];
//len *= 2;
ans[++cnt] = len;
int res = KMP(len);
if(res != -1)
{
ans[++cnt] = res;
}
while(1)
{
len = Next[len];
res = Next[len];
if(res == -1) break;
ans[++cnt] = res;
}
printf("%d",ans[cnt-1]);
for(int i = cnt-2; i >= 1; i--) printf(" %d",ans[i]);
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: