KMP。
一直没有一个裸kmp,根本看不懂kmp。。。//蒟蒻本性。
kmp的部分匹配值next[j],在这个实现中的意思是,如果b[j+1]和a[i]失配,j=next[j]。
就是不断返回直到b[j+1]==a[i]。
计算的话,就用自己匹配自己吧。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 200 + 10; char a[maxn],b[maxn]; int next[maxn]; int n,m,j; int main() { scanf("%s%s",a+1,b+1); n=strlen(a+1),m=strlen(b+1); j=0; for(int i=2;i<=m;i++) { while(j && b[j+1]!=b[i]) j=next[j]; if(b[j+1]==b[i]) j++; next[i]=j; } j=0; for(int i=1;i<=n;i++) { while(j && b[j+1]!=a[i]) j=next[j]; if(b[j+1]==a[i]) j++; if(j==m) { //匹配成功 printf("%d ",i-m+1); break; } } return 0; }