【KMP算法】KMP统计子串出现次数

来源:互联网 发布:linux 替换jar包文件 编辑:程序博客网 时间:2024/06/10 02:36
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;}




0 0