题目传送门
1 /*
2 题意:求出一个串的前缀与后缀相同的字串的长度
3 KMP:nex[]就有这样的性质,倒过来输出就行了
4 */
5 /************************************************
6 * Author :Running_Time
7 * Created Time :2015-8-10 11:29:25
8 * File Name :POJ_2752.cpp
9 ************************************************/
10
11 #include <cstdio>
12 #include <algorithm>
13 #include <iostream>
14 #include <sstream>
15 #include <cstring>
16 #include <cmath>
17 #include <string>
18 #include <vector>
19 #include <queue>
20 #include <deque>
21 #include <stack>
22 #include <list>
23 #include <map>
24 #include <set>
25 #include <bitset>
26 #include <cstdlib>
27 #include <ctime>
28 using namespace std;
29
30 #define lson l, mid, rt << 1
31 #define rson mid + 1, r, rt << 1 | 1
32 typedef long long ll;
33 const int MAXN = 4e5 + 10;
34 const int INF = 0x3f3f3f3f;
35 const int MOD = 1e9 + 7;
36 int nex[MAXN];
37 char str[MAXN];
38
39 void get_nex(void) {
40 int len = strlen (str);
41 int i = 0, j = -1; nex[0] = -1;
42 while (i < len) {
43 if (j == -1 || str[j] == str[i]) {
44 j++; i++; nex[i] = j;
45 }
46 else j = nex[j];
47 }
48 vector<int> ans;
49 while (i != -1) {
50 ans.push_back (i); i = nex[i];
51 }
52 for (int i=ans.size ()-2; i>=0; --i) {
53 printf ("%d ", ans[i]);
54 }
55 puts ("");
56 }
57
58 int main(void) { //POJ 2752 Seek the Name, Seek the Fame
59 while (scanf ("%s", str) == 1) {
60 get_nex ();
61 }
62
63 return 0;
64 }