HDU 1686Oulipo

来源:互联网 发布:mac mpv播放器 慢放 编辑:程序博客网 时间:2024/06/04 23:30

HDU的题意就是,给你一个字符串A,一个字符串B,求A在B中总共出现了几次,注意,重复的也算。

KMP算法,过程中记录次数。

#include <cstdio>#include <cstring>using namespace std;#define L(i) i<<1#define R(i) i<<1|1#define INF  0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-3#define maxn 1000010#define MOD 100000000int n,m;int next[10011];char a[maxn];char b[10010];void get_next(){    int i = 0,j = -1;    next[0] = -1;    while(i < m)    {        if(j == -1 || b[i] == b[j])            next[++i] = ++j;        else            j = next[j];    }}int KMP(){    int i = 0,j = 0,cnt = 0;    while(i < n)    {        if(a[i] == b[j] || j == -1)        {            i++;            j++;        }        else            j = next[j];        if(j == m)        {            cnt++;            j = next[j];        }    }    return cnt;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%s%s",b,a);        n = strlen(a);        m = strlen(b);        get_next();        int ans = KMP();        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击