POJ3461——Oulipo KMP算法的应用

来源:互联网 发布:mac 命令行 重启 编辑:程序博客网 时间:2024/06/09 23:28

题目地址:
戳我戳我~

题目大意:
多组数据询问,每组数据2个字符串,问上面字符串在下面的字符串中出现的次数(匹配的次数);

算法分析:
首先 暴力能做但是显然超时,字符串匹配还有一种更方便更快的方法:KMP!
今天刚学的KMP哇好开心啊~…………
这里我们只需要把KMP的return部分的操作改成cnt++记录一下次数,然后return cnt;即可。
代码很短,主要是为了KMP模板。
我的KMP模板借鉴了黄学长(黄神犇)的博客里的KMP模板。
点我戳黄学长

不多说,代码如下:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int size = 1000010;char s1[size],s2[size];int next[size];int l,ll;void getne(char* a){    memset(next,0,sizeof(next));    int j = 0;    for(int i = 2;i <= l;i ++)    {        while(j && a[i] != a[j+1])  j = next[j];        if(a[i] == a[j+1]) j ++;        next[i] = j;    }}int find(char* a,char* b){    getne(b);    int j = 0;    int cnt = 0;    for(int i = 1;i <= ll;i ++)    {        while(j && a[i] != b[j+1])  j = next[j];        if(a[i] == b[j+1])  j ++;        if(j == l)  cnt ++;    }    return cnt;}int main(){    int t;    scanf("%d",&t);    getchar();    for(int i = 1;i <= t;i ++)    {        gets(s2+1);        gets(s1+1);        l = strlen(s2+1);        ll = strlen(s1+1);        int ans = find(s1,s2);        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击