用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

kmp

2016-10-28 作者: 云代码会员举报

[c++]代码库

/*
    2016年4月28日10:27:36
    kmp
    注意重复的也算
    p:AZA
    t:AZAZAZA

    ans = 3;
*/
#include<stdio.h>
#include<string.h>

const int maxn = 1e6 + 5;

char p[10005];
int next[10005];
char t[maxn];

void makenext()
{
    int m = strlen(p);
    next[0] = 0;
    for(int q = 1,k = 0;q < m;q++)
    {
        while(k > 0 && p[q] != p[k])
            k = next[k-1];          //跳到上一个前缀
        if(p[q] == p[k])
            k++;
        next[q] = k;
    }
}
int kmp()
{
    int ans = 0;
    int m = strlen(p);
    int n = strlen(t);
    for(int i = 0,q = 0;i < n;i++)
    {
        while(q > 0 && p[q] != t[i])
            q = next[q-1];
        if(p[q] == t[i])
            q++;
        if(q == m)
        {
            ans++;
            q = next[q-1];  //如果重复的不算的话,q = 0;和上面的k = next[k-1];比较看一下
        }
    }
    return ans;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",p);
        scanf("%s",t);
        makenext();
        printf("%d\n",kmp());
    }
    return 0;
}
/*
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN

1
3
0
*/

[源代码打包下载]




网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...