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;
}
原文地址:https://www.cnblogs.com/jifahu/p/5445980.html