题目链接:点击打开链接
思路: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;
}

本文深入探讨了KMP算法的实现及其在周期字符串检测中的应用。通过具体实例讲解了Next数组的计算方法,并提供了完整的代码示例。适用于对字符串匹配算法感兴趣的读者。
&spm=1001.2101.3001.5002&articleId=78377362&d=1&t=3&u=7830c7a6d2844a1c9928cf19bc2e8098)

被折叠的 条评论
为什么被折叠?



