poj2752 KMP
需要理解next[]的意义。之前看到大牛的博客,next[]讲的非常清楚。
利用next[],当前位子的前面那一段和next[当前位子]的前面那一段是相同的。又next[next[当前位子]]与next[当前位子]有一段相同,所以当前位子的前面一段和
next[next[当前位子]]的前一段有相同即可。
#include<stdio.h> #include<string.h> #include<stack> using namespace std; #define maxn 400010 int next[maxn]; char s[maxn]; void getnext() { int j,k,len=strlen(s); next[0]=-1; j=0; k=-1; while(j<len) { if(k==-1||s[j]==s[k]) { j++; k++; next[j]=k; } else k=next[k]; } } int main() { int i,j,flag; while(scanf("%s",s)!=EOF) { flag=0; stack<int>sta; getnext(); i=strlen(s); sta.push(i); while(next[i]!=0) { sta.push(next[i]); i=next[i]; } while(!sta.empty()) { int ans=sta.top(); sta.pop(); if(flag==0) { flag=1; printf("%d",ans); } else printf(" %d",ans); } printf("\n"); } }