题目
https://www.luogu.org/problemnew/show/P3375
解题思路
因为之前做的 k m p kmp kmp的题目都只用求 n e x t next 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(' ');
}