Period HDU

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int n;
char a[maxn];
int ne[maxn];
void cal_next(char b[]) {
	for (int i=2,j=0;i<=n; i++) {
		while(j&& b[j+1]!=b[i])
			j=ne[j];
		if(b[j+1]==b[i])
			j++;
		ne[i]=j;
	}
}
int main() {
	int cnt = 0;
	while (~scanf("%d", &n)) {
		if (n == 0)
			break;
		scanf("%s", a+1);
		printf("Test case #%d
", ++cnt);
		cal_next(a);
		for (int i=1;i<=n;i++) 
		{
			if(ne[i]==0)
				continue;
			//表示往前跳了多少,也就是循环节的长度 
			int len=i-ne[i];
			//如果是循环节 , 
			if(i%len==0) 
								//循环次数 
				printf("%d %d
",i,i/len);
		}
		printf("
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12384396.html