hdu 1358 Period
题意:给定一个字符串,问这个字符串的所有前缀中,前缀最多重复的次数k,这个k需要大于1。
KMP最小循环节、循环周期:
定理:假设S的长度为len,则S存在最小循环节,
循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。(1)如果len可以被len - next[len]整除,
则表明字符串S可以完全由循环节循环组成,循环周期k=len/(len-next[len])。
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <stack>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=1e6+10;
char s[maxn];
int nxt[maxn],n;
void getnext()
{
int i=0,j=-1;
nxt[0]=-1;
while(i<n)
{
if (j==-1||s[i]==s[j])
{
i++,j++;
nxt[i]=j;
}
else
j=nxt[j];
}
}
int main()
{
int i,j;
int f=0;
while(~scanf("%d",&n)&&n)
{
f++;
scanf("%s",s);
getnext();
printf("Test case #%d\n",f);
for (i=1; i<=n; i++)
if (i%(i-nxt[i])==0&&nxt[i]!=0)
printf("%d %d\n",i,i/(i-nxt[i]));
printf("\n");
}
return 0;
}