1. 程式人生 > >[luogu 3375] 【模板】KMP字串匹配

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

題目

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


解題思路

因為之前做的 k m p kmp 的題目都只用求 n e

x t next 陣列,而對後面的字串模式匹配根本就用不到, 所以特地打一篇模板。


程式碼

#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(' '); }