hdu1686 Oulipo【kmp】

来源:互联网 发布:新编诸子集成知乎 编辑:程序博客网 时间:2024/06/04 19:49

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686
题意:给你字符串W和T,让你求W在T中出现了多少次,可重叠的计算(见样例)
解析:每次匹配完的时候cnt++,然后让j=nex[j]

#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int maxn = 1000000+100;char a[maxn],b[maxn];int nex[maxn];void getNex(char a[]){    int len = strlen(a);    memset(nex,-1,sizeof(-1));    int k = -1,i = 0;    while(i<len)    {        if(k==-1 || a[k]==a[i])        {            k++,i++;            nex[i] = k;        }        else            k = nex[k];    }}int kmp_cnt(char a[],char b[]){    int len1 = strlen(a),len2 = strlen(b);    int i=0,j=0;    int cnt = 0;    getNex(b);    while(i<len1 && j<len2)    {        if(a[i]==b[j])        {            i++;            j++;            if(j==len2)            {                cnt++;                j =nex[j];            }        }        else if(j==0)            i++;        else            j = nex[j];    }    return cnt;}int main(void){    int t;    cin>>t;    while(t--)    {        scanf("%s %s",b,a);        int ans = kmp_cnt(a,b);        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击