考前挣扎,奶一口,绝对不会考字符串(因为我不会)
KMP算法:
求出模式串在主串中出现的所有位置及nxt数组
之后可能加上一个计算出现次数的函数
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
int slen, tlen;
int nxt[N];
char S[N], T[N];
void getnxt(){
int j = 0, k = -1;
nxt[0] = -1;
while(j < tlen){
if(k == -1 || T[j] == T[k]) nxt[++j] = ++k;
else k = nxt[k];
}
}
void KMP(){
int i = 0, j = 0;
getnxt();
while(i < slen && j < tlen){
if(j == -1 || S[i] == T[j]) ++i, ++j;
else j = nxt[j];
if(j == tlen) printf("%d
", i-tlen+1), j = nxt[j];
}
}
int main(){
freopen("kmp.in", "r", stdin);
freopen("kmp.out","w",stdout);
scanf("%s", S); scanf("%s", T);
slen = strlen(S);
tlen = strlen(T);
KMP();
for(int i = 1; i <= tlen; ++i) printf("%d ", nxt[i]);
puts("");
return 0;
}