[luogu 3375] 【模板】KMP字串匹配
阿新 • • 發佈:2018-12-08
題目
https://www.luogu.org/problemnew/show/P3375
解題思路
因為之前做的 的題目都只用求 陣列,而對後面的字串模式匹配根本就用不到, 所以特地打一篇模板。
程式碼
#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(' ');
}