/*
题意:给定字符串,判断哪些下标开始即是它的前缀又是它的后缀
同时,由kMP中next[]的性质可得,模式串的前半部分的字符和后半部分的字符
相同。
*/
#include<stdio.h>
#include<string.h>
#define max 400010
int next[max];
char str[max];
void get_next(char tem[])
{
int j=0,k=-1;
int len=strlen(tem);
next[0]=-1;
while(j<len)
{
if(k==-1||tem[j]==tem[k])
next[++j]=++k;
else
k=next[k];
}
}
void output(int n)
{
if(next[n]>=0)
output(next[n]);
if(n>0)
printf("%d ",n);
}
int main()
{
while(scanf("%s",str)!=EOF)
{
int t=strlen(str);
get_next(str);
output(next[t]);
printf("%d\n",t);
}
return 0;
}
poj2752 kmp 进一步运用
最新推荐文章于 2022-05-04 02:00:00 发布