题目链接:
http://poj.org/problem?id=2752
题目大意:
给一个字符串,求出他前缀和后缀相同时的他们的长度。
思路:
还是next数组的应用,先求整个字符串的next数组,然后可以知道next[len],代表着整个字符串的最大相同前缀和后缀长度x。然后看next[x],意思就是前x个字符的最大相同前缀和后缀长度,按照这样的方式一直循环,直到next[x]=0为止,中间记录的值就是答案。
代码:
#include<stdio.h>
#include<string.h>
int next[450005];
char s[450005];
int ans[450005];
void GetNext(char* p,int next[],int l)
{
// memset(next,0,sizeof(next));
int pLen = l;
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen )
{
//p[k]表示前缀,p[j]表示后缀
if (k == -1 || p[j] == p[k])
{
++j;
++k;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int main()
{
while(scanf("%s",s)!=EOF)
{
int k=1,x=0;
int l=strlen(s);
x=l;
GetNext(s,next,x);
while(1)
{
if(next[x]==0)break;
ans[k++]=next[x];
x=next[x];
}
ans[k]=l;
for(int i=k-1;i>=1;i--)
printf("%d ",ans[i]);
printf("%d\n",ans[k]);
}
}