一.原题链接:http://poj.org/problem?id=3461
二.题目大意:给一个模式串和一个匹配串,问模式串在匹配串中出现几次。
三.解题思路:KMP模板题:注意KMP每次匹配失效的时候的位移(最好举个例子就不会乱)。每次找到一个记得j = Next[j-1],回到前一个的对称前缀。
四.代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX_N = 10100,
INF = 0x3f3f3f3f;
int Next[MAX_N];
char pattern[MAX_N], match[1000100];
void getNext()
{
int i, k;
Next[0] = 0;
for(i = 1; pattern[i]; i++){
k = Next[i-1];
while(pattern[i] != pattern[k] && k > 0)
k = Next[k-1];
if(pattern[i] == pattern[k])
Next[i] = k+1;
else
Next[i] = 0;
}
}
int KMP()
{
getNext();
int i = 0, j = 0, cnt = 0;
while(match[i]){
while(j > 0 && pattern[j] != match[i])
j = Next[j-1];
if(pattern[j] == match[i])
i++, j++;
else
i++;
if(!pattern[j]){
cnt++;
j = Next[j-1];
}
}
return cnt;
}
int main()
{
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--){
scanf("%s%s", pattern, match);
printf("%d\n", KMP());
}
return 0;
}