[luogu 3375] 【模板】KMP字符串匹配

題目

https://www.luogu.org/problemnew/show/P3375


解題思路

因爲之前做的kmpkmp的題目都只用求nextnext數組,而對後面的字符串模式匹配根本就用不到, 所以特地打一篇模板。


代碼

#include<cstdio>
#include<cstring>
using namespace std; 
char c1[1000010],c2[1000010]; 
int kmp[1000010]; 
void write(int x){if (x>9) write(x/10); putchar(x%10+48);}
signed main()
{
	scanf("%s%s",c1,c2); 
	int len1=strlen(c1),len2=strlen(c2); 
	for (register int i=1,k=0;i<len2;kmp[i+1]=c2[k]==c2[i]?++k:0,++i)
		while (k&&c2[i]!=c2[k]) k=kmp[k]; 
	for (register int i=0,k=0;i<len1;++i){
	 	while (k&&c1[i]!=c2[k]) k=kmp[k]; 
		if ((k+=(c1[i]==c2[k]))==len2) write(i-len2+2),putchar('\n'); 
	}
	for (register int i=1;i<=len2;i++) write(kmp[i]),putchar(' '); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章