http://poj.org/problem?id=3461
题意:题意很明确,就是用第一行的字符串来匹配第二行给出的字符串,能在第二行的字符串中找出几个第一行这样的字符串。
思路:入门KMP算法题,打出匹配串的对应部分匹配值,然后在用kmp算法来匹配。kmp算法参考另一篇文章。
开始学kmp算法,感觉理解算法之后代码实现还是有一定套路性的,只需要每次注意一些不同题目要求来更改些细节的代码实现即可。【目前想法】
【代码实现】
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXW=10001,MAXT=1000001;
char W[MAXW],T[MAXT];
int next[MAXW];
int lenW,lenT;
void getnext(int lenW)
{
int i=0,j=-1;
next[i]=-1;
while(i<lenW) {
if(j==-1||W[i]==W[j]) {
next[++i]=++j;
}
else j=next[j];
}
}
int kmp(int pos,int lenW,int lenT)
{
int i=pos,j=0,ans=0;
while(i<lenT) {
if(T[i]==W[j]||j==-1) ++i,++j;
else j=next[j];
if(j==lenW) {
ans++;
j=next[j-1];
i--;
}
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
while(n--) {
scanf("%s%s",W,T);
lenW=strlen(W);
lenT=strlen(T);
getnext(lenW);
printf("%d\n",kmp(0,lenW,lenT));
}
return 0;
}