zoukankan      html  css  js  c++  java
  • HDU 1686 Oulipo(KMP+计算匹配成功次数)

      一开始总是超时,后来发现还是方法没找对,这个跟普通KMP不太一样的就是,KMP匹配成功的时候会完全跳过已经匹配成功的匹配段,至少我掌握的是.那么如何避免这样的问题呢,举个栗子啊

    原串为ABABA,模式串为ABA,当匹配成功的时候,只要跳转到模式串最大公共前后缀长度就行了,ABA的长度为1,所以就是从原串的第二个B开始进行匹配,这样就不会漏了,记录所有匹配成功的次数就是答案.

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char a[1000010],b[10010];
    int Next[10010];
    int get_next(const char *p)
    {
        Next[0] = 0;
        int lenp = strlen(p);
        for(int i = 1,k = 0;i < lenp;i++)
        {
            while(k > 0 && p[k] != p[i])
                k = Next[k-1];
            if(p[k] == p[i]) k++;
            Next[i] = k;
        }
    }
    int kmp(const char *t,const char *p)
    {
        int lent = strlen(t),lenp = strlen(p);
        get_next(p);
        int ans = 0;
        for(int i = 0,q = 0;i < lent;i++)
        {
            while(q > 0 && p[q] != t[i])
                q = Next[q-1];
            if(p[q] == t[i]) q++;
            if(q == lenp)
            {
                q = Next[q-1];///如上述
                ans++;
            }
        }
        return ans;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s%s",b,a);
            printf("%d
    ",kmp(a,b));
        }
        return 0;
    }
  • 相关阅读:
    1043. 输出PATest(20)
    1042. 字符统计(20)
    1041. 考试座位号(15)
    1040. 有几个PAT(25)
    1035. 插入与归并(25)
    栈:火车进站
    ABC Fennec VS. Snuke
    费解的开关
    最短Hamilton路径
    built?
  • 原文地址:https://www.cnblogs.com/jifahu/p/5445980.html
Copyright © 2011-2022 走看看