模板题:https://www.luogu.org/problem/P3375
学习了kmp算法,虽然不是太懂,贴一个模板先。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1000010
using namespace std;
char s1[MAXN],s2[MAXN];
int nxt[MAXN],f[MAXN],len1,len2;
void CalcNext()
{
for(int i=2,j=0;i<=len2;i++)
{
while(j>0&&s2[i]!=s2[j+1]) j=nxt[j];
if(s2[i]==s2[j+1]) j++;
nxt[i]=j;
}
}
void Kmp()
{
for(int i=1,j=0;i<=len1;i++)
{
while(j>0&&(j==len2||s1[i]!=s2[j+1])) j=nxt[j];
if(s1[i]==s2[j+1]) j++;
f[i]=j; //如果f[i]==len2说明s1以第i位结尾的字串和s2成功匹配
}
}
int main()
{
scanf("%s %s",s1+1,s2+1);
len1=strlen(s1+1);
len2=strlen(s2+1);
CalcNext();
Kmp();
for(int i=1;i<=len1;i++) if(f[i]==len2) printf("%d\n",i-len2+1);
for(int i=1;i<=len2;i++) printf("%d ",nxt[i]);
printf("\n");
return 0;
}
来源:https://www.cnblogs.com/BakaCirno/p/11315602.html