KMP
我们要查询
设
设
我们先想想这个寄(雾)怎么求
那么这个
考虑枚举
假设
其实就是,border 的 border 还是 border。
标红的表示等同的部分,我们会发现要的就是
对于这个
code
char a[MN], b[MN];
int n, m, g[MN], f[MN];
scanf("%s%s", b+1, a+1);
m=strlen(b+1), n=strlen(a+1), g[1]=0;
for(int i=2, j=0; i<=n; ++i) {
while(j>0&&a[j+1]!=a[i]) j=g[j];
j+=(a[j+1]==a[i]), g[i]=j;
}
for(int i=1, j=0; i<=m; ++i) {
while(j>0&&(j==n||a[j+1]!=b[i])) j=g[j];
j+=(a[j+1]==b[i]), f[i]=j;
// if(f[i]==n) printf("%d\n", i-n+1);
}