对应POJ题目:点击打开链接
如 aabaabaabaab 的前缀aabaabaab 有9个字符,周期为3,故重复次数为3
思路:实在是没有留意到可以这样用KMP。还是那9个字符,next[9] = 6,表示在前9个字符中,最多有前6个字符跟后6个字符相同,即next数组保存的是当前字符串的最长公共前后缀,而对于一个连续重复字符串在next数组中有这样的关系:: ————--
a a b a a b a a b 这里是next[j] = k, 这样用j - k 就得到循环串的周期,再用 j / (j - k) 就是重复次数
————--
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#define ms(x,y) memset(x,y,sizeof(x))
const int MAXN=1000000+10;
const int INF=1<<30;
using namespace std;
int next[MAXN];
char str[MAXN];
void Getnext()
{
int j = 0, k = -1;
next[0] = -1;
int len = strlen(str);
while(j < len)
{
if(-1 == k || str[j] == str[k]){
j++; k++;
if(0 == j%(j-k) && j/(j-k)>1)
printf("%d %d\n", j, j/(j-k));
next[j] = k;
}
else k = next[k];
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n, w = 0;;
while(scanf("%d", &n), n)
{
scanf("%s", str);
printf("Test case #%d\n", ++w);
Getnext();
printf("\n");
}
return 0;
}