FZU1901
本题题意为求一个长度
P
P
,使所有的
满足
S[i]=S[i+P]
S
[
i
]
=
S
[
i
+
P
]
本题考验next数组的理解运,在此重复一遍,kmp的next不断向前递归的过程可以保证对于每一个当前前缀,都有一段后缀与之对应,(对这里不太理解的,可以去看我的KMP专题博客),所以对于每一个next,我们都可以将他与最后的后缀对应作为一组答案。
FZU1901代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stack>
using namespace std ;
const int maxn = 1e6+5;
int Next[maxn];
char mo[maxn];
int n1,n2;
void GetNext()
{
int i=0,j=-1;
while(i<n2)
{
if(j==-1||mo[i]==mo[j]) {++i,++j,Next[i]=j;}
else j=Next[j];
}
return ;
}
int ans[maxn];
int main()
{
int cnt=1;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",mo);
n2=strlen(mo);
Next[0]=-1;
int pp=0;
GetNext();
int tmp=Next[n2];
while(tmp!=0)
{
ans[pp++]=tmp;
tmp=Next[tmp];
}
printf("Case #%d: %d\n",cnt++,pp+1);
for(int i=0;i<pp;i++)
printf("%d ",n2-ans[i]);
printf("%d\n",n2);
}
return 0;
}