KMP简单应用,利用next,一个一个确定是否和后缀匹配
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=400000+10; char s[maxn]; int next[maxn]; int amount[maxn]; int main() { while(~scanf("%s",s)) { int len=strlen(s); int i=0,j=-1; next[0]=-1; while(i<len) { if(j==-1||s[i]==s[j]) { i++; j++; next[i]=j; } else j=next[j]; } j=next[len-1]; int tot=0; while(j!=-1) { if(s[j]==s[len-1]) amount[tot++]=j+1; j=next[j]; } for(i=tot-1;i>=0;i--) printf("%d ",amount[i]); printf("%d\n",len); } return 0; }