1 #define bug(x) cout<<#x<<" is "<<x<<endl
2 #include <bits/stdc++.h>
3 using namespace std;
4 const int N=1e3+10;
5 int n,m;
6 char p[1005]={"*abaabc"},T[1005];
7 int f[1005],h[1005];
8 void get_next(int next[]){
9 int i=1,j=0;
10 while(i<n){
11 if(j==0||p[i]==p[j]){
12 i++,j++;
13 next[i]=j;
14 }
15 else{
16 j=next[j];
17 }
18 }
19 for(int z=1;z<=n;z++){
20 printf("%d ",next[z]);
21 }
22 }
23 void GetNextval(char* p, int next[])
24 {
25 next[1] = 0;
26 int j = 0;
27 int i = 1;
28 while (i < n)
29 {
30 if (j == 0 || p[j] == p[i])
31 {
32
33 ++j;
34 ++i;
35 if (p[j] != p[i])
36 {
37 //printf("*i=%d j=%d \n",i,j);
38 next[i] = j;
39 }
40 else {
41 //printf("i=%d j=%d \n",i,j);
42 next[i] = next[j];
43 }
44 }
45 else
46 {
47 j = next[j];
48 }
49 }
50 for(int z=1;z<=n;z++){
51 printf("%d ",next[z]);
52 }
53 }
54 int main(){
55 n=strlen(p+1);
56 for(int i=1;i<=12;i++){
57 printf("%c ",p[i]);
58 }
59 printf("\n");
60 get_next(h);
61 printf("\n");
62 GetNextval(p,f);
63 }
64 /*
65 ababaaababaa
66
67 */