POJ-2406 Power Strings
题目链接:POJ-2406
题目大意:检测一个字符串从头开始最多有多少个重复片段
解题思路:利用kmp的求next数组的方法 求出next数组,之后看前缀和后缀最长的重合有多长 总长度减去重合的长度就是一个一个重复片段的长度 最后总长度除以一个重复片段的长度即可得出结果,当然如果总长度不是得出的重复片段长度的整数倍,说明只有最前面字符自己喽,输出一就好
代码块:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
char strA[1000009] = {'\0'};
int Next[1000009] = {0};
void getNext() {
int len = strlen(strA);
memset(Next, 0, sizeof(Next));
int i = 1, j = 0;
while(i < len) {
if(strA[i] == strA[j]) {
Next[i] = ++j;
++i;
}else if(j != 0){
j = Next[j - 1];
}else{
Next[i] = 0;
i++;
}
}
}
int main() {
while(cin>>strA) {
if(strA[0] == '.') break;
getNext();
int len = strlen(strA);
int num = Next[len - 1];
if(len % (len - num) == 0) cout<< len / (len - num) << endl;
else cout<< 1 <<endl;
}
return 0;
}