题目链接
题意:
求模式串在主串出现的次数
思路:
KMP
不会戳这里
AC:
#include<stdio.h>
#include<cstring>
#include<math.h>
using namespace std;
char s[1000005], p[10005];
int Next[10005];
int n, m;
int Ans = 0;
void GetNextval() {
int j = 0;
int k = -1;
Next[0] = -1;
int pLen = strlen(p);
while(j < pLen) {
if(k == -1 || p[k] == p[j]){
++j;
++k;
if(p[k] != p[j])
Next[j] = k;
else
Next[j] = Next[k];
} else {
k = Next[k];
}
}
}
void KmpSearch(int sLen, int pLen) {
int i = 0, j = 0;
while( i < sLen ) {
if(s[i] == p[j] || j == -1) {
++i;
++j;
} else {
j = Next[j];
}
if(j == pLen){
Ans ++;
j = Next[j];
printf("%d\n", j);
}
}
}
int main(){
int T;
scanf("%d", &T);
while(T--) {
scanf("%s%s", p, s);
int sLen = strlen(s);
int pLen = strlen(p);
GetNextval();
Ans = 0;
KmpSearch(sLen, pLen);
printf("%d\n", Ans);
}
return 0;
}