题目链接:点击打开链接
思路:KMP水题,Next函数的应用。求字符串的每个前缀是否是周期串,是的话就输出循环节长度和循环次数。此题注意的是,不能优化求Next部分。
// HDU 1358 Period 运行/限制:124ms/1000ms
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char s[1000005];
int Next[1000005];
void getNext(char s[], int n) {
int i, j;
i = -1, j = 0;
Next[0] = -1;
while (j < n) {
if (i == -1 || s[i] == s[j]) {//此题不能优化
i++;
j++;
Next[j] = i;
}
else {
i = Next[i];
}
}
}
int main(){
int cnt = 0,n;
while (scanf("%d%s", &n,s) != EOF && n) {
getNext(s, n);
printf("Test case #%d\n", ++cnt);
for (int i = 2; i <= n; i++) {
int len = i;
int length = len - Next[i];
if (len % length == 0 && len != length) {//是否是周期串且周期>1
printf("%d %d\n", len, len / length);
}
}
printf("\n");
}
return 0;
}