题目链接:http://poj.org/problem?id=2752
题目大意:给你一个字符串 (S) ,如果它的一个前缀同时也是它的后缀,则输出这个前缀(后缀)的长度。
题目分析:next函数的一个应用。我们设 (S) 串的长度为 (n) ,则我们首先设 (j=n-1) ,然后只要 (nxt[j] != -1) ,那么 (j+1) 就是一个答案,循环使 (j=nxt[j]) 。
实现代码如下:
#include <iostream>
#include <string>
using namespace std;
const int maxn = 404000;
int m, nxt[maxn];
string t;
char ch[maxn];
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;
}
}
bool output(int j) {
if (j == -1) return false;
if (output(nxt[j])) cout << " ";
cout << j + 1;
return true;
}
int main() {
while (cin >> t) {
cal_next();
output(m-1);
cout << endl;
}
return 0;
}
作者:zifeiy