题目链接:http://poj.org/problem?id=2406
题目大意:给你一个字符串 (t) ,(t) 可以表示为另一个小字符串循环了 (K) 了,求最大的循环次数 (K) 。
题目分析:设字符串长度为 (m) ,如果 (m-1-nxt[m-1]) 能够整除 (m) ,则 (K=m/(m-1-nxt[m-1])) ,否则 (K=1) 。
实现代码如下:
#include <cstdio>
#include <string>
using namespace std;
const int maxn = 1001000;
int m, nxt[maxn];
string t;
char ch[maxn];
string read() {
scanf("%s", ch);
string tmp_s = ch;
return tmp_s;
}
void cal_next() {
m = t.length();
for (int i = 0, j = -1; i < m; i ++) {
while (j != -1 && t[j+1] != t[i]) j = nxt[j];
nxt[i] = (j+1 < i && t[j+1] == t[i]) ? ++j : -1;
}
}
int main() {
while (true) {
t = read();
if (t == ".") break;
cal_next();
int K = 1;
if (m % (m-1-nxt[m-1]) == 0) {
K = m / (m-1-nxt[m-1]);
}
printf("%d
", K);
}
return 0;
}
作者:zifeiy