大致题意:
给出一个字符串,一个文本,输出这个字符串在文本中出现的次数。
思路:
w是模式,t是目标。
应用KMP算出w的后缀函数next,然后使用next计算单词w在文本t中出现的频率cnt。
KMP KMP
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int W = 10010, T = 1000010;
int match(char w[], char s[], int next[]){
int cnt = 0;
int slen = strlen(s);
int wlen = strlen(w);
int p = 0, cur = 0;
while(cur < slen){//未扫描完s所有字符
if(s[cur] == w[p]){//s、w当前字符相同,则二者指针都右移1
cur++;
p++;
}else if(p >= 0){
p = next[p];
}else{
cur++;
p = 0;
}
if(p == wlen){
cnt++;
p = next[p];
}
}
return cnt;
}
int main(){
int tt;
scanf("%d", &tt);
while(tt--){
char w[W], t[T];
scanf("%s%s", w, t);
int suf[W];
suf[0] = -1;
suf[1] = 0;
int p = 0;
for(int cur = 2; cur <= strlen(w); cur++){
while(p >= 0 && w[p] != w[cur - 1])
p = suf[p];
suf[cur] = ++p;
}
printf("%d\n", match(w, t, suf));
}
return 0;
}