【模板複習】
SOL
KMP是用於單模匹配的算法,核心在於其nxt指針——模式串中每一個位置上的最長公共前後綴
即:表示模式串最長公共前後綴
每次失配之後KMP不會跳回串首,而是調到上一個可以匹配的地方——nxt指針對應的位置
getnxt的過程就是自我匹配的過程
代碼:
#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=4e5+5;
char s[N];
int nxt[N],len,ans,vis[N];
inline void getnxt(){
len=strlen(s+1),ans=0;
for(int re j=0,i=1;i^len;++i){
while(j>0&&s[i+1]!=s[j+1])j=nxt[j];
if(s[i+1]==s[j+1])++j;
nxt[i+1]=j;
}
for(int re i=len;i;i=nxt[i])vis[++ans]=i;
for(int re i=ans;i;--i)printf("%d ",vis[i]);puts("");
}
signed main(){
while(scanf("%s",s+1)!=EOF)getnxt(),memset(nxt,0,sizeof(nxt)),memset(vis,0,sizeof(vis));
exit(0);
}