[FROM LOJ]#10036. 「一本通 2.1 練習 2」Seek the Name, Seek the Fame

傳送門

【模板複習】

SOL
KMP是用於單模匹配的算法,核心在於其nxt指針——模式串中每一個位置上的最長公共前後綴
即:nxt[j]nxt[j]表示模式串1...j1...j最長公共前後綴
每次失配之後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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章