POJ_2752_Seek the Name, Seek the Fame
/* 题意:求公共前缀和后缀相同的部分是什么 Input: ababcababababcabab aaaaa Output: 2 4 9 18 1 2 3 4 5 */ #include<iostream> #include<cstring> #include<string> #include<cmath> #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define M 400005 int lena,lenb,Max; int nt[M]; char b[M]; void getnt(char *b) { int j=0,k=-1; nt[0]=-1; while(j<lenb) { if(k==-1||b[j]==b[k]) //此举旨在找寻B串中重复的东东 { k++,j++; //如果下一个b[j]不等于b[k],那下一次nt[j]要回到k的位置,这是高速回位的方法 nt[j]=k; } else k=nt[k]; } /*for(int i=0; i<=lenb; ++i) printf("%d ",nt[i]); puts("");*/ } void dfs(int mark) { if(mark==0) return; dfs(nt[mark]); printf("%d ",mark); } int main() { while(~scanf("%s",b)) { lenb=strlen(b); getnt(b); dfs(nt[lenb]); printf("%d\n",lenb); } }