- 对于一个串, 假定在i处形成循环, 那么 next[i]应该是上一个循环节尾,所以i % (i - next[i]) == 0且next[i] > 0当前i - next[i]是最小循环节的长度.
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <set>
#include <map>
using namespace std;
const int N = 1000010;
char S[N];
int n, Next[N];
void getNext(){
Next[0] = -1, Next[1] = 0;
int i = 1, j = 0;
while(i < n){
if(j == -1 || S[i] == S[j]) Next[++i] = ++j;
else j = Next[j];
}
}
int main(){
int cas = 1;
while(cin >> n, n){
cin >> S;
getNext();
cout << "Test case #" << cas++ << endl;
for(int i = 2; S[i - 1]; ++i){
int t = i - Next[i];
if(i % t == 0 && Next[i]) cout << i << " " << i / t << endl;
}
cout << endl;
}
return 0;
}

本文介绍了一种基于KMP算法的字符串匹配方法,并详细解释了如何通过计算next数组来找到字符串中的循环节。通过一个具体的C++实现案例,展示了如何判断一个字符串是否存在循环,并计算出循环节的长度。
5万+

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



