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;
 }
上一篇:RK: RK3288 遥控器调试


下一篇:redis 简单限流