题目链接
http://poj.org/problem?id=3461
题目大意
给出模式串W和主串T,求W在T中的出现次数。
思路
最基础的KMP。
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define MAXN 1001000
#define MAXM 10010
using namespace std;
char word[MAXM],text[MAXN];
int next[MAXM];
void getnext(char str[],int len)
{
int k=0;
next[1]=0;
for(int i=2;i<=len;i++)
{
while(k>0&&str[k+1]!=str[i]) k=next[k];
if(str[k+1]==str[i]) k++;
next[i]=k;
}
}
int match(char W[],int lenW,char T[],int lenT)
{
int ans=0;
getnext(W,lenW);
int k=0; //W已经匹配的长度
for(int i=1;i<=lenT;i++)
{
while(k>0&&W[k+1]!=T[i]) k=next[k];
if(W[k+1]==T[i]) k++;
if(k==lenW)
{
ans++;
k=next[k];
}
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(next,0,sizeof(next));
scanf("%s",word+1);
scanf("%s",text+1);
printf("%d\n",match(word,strlen(word+1),text,strlen(text+1)));
}
return 0;
}