HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)

  这个题目的数据应该是比较弱的,赛场上的时候我们暴力也过了,而且我的kmp居然比暴力还要慢…… 这个变形并不难,跳着选数,把漏掉的位置补上就可以了。

  代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 1000005
int a[N],b[N],Next[N],n,m,q;
void getNext()
{
    int j, k;
    j = 0;
    k = -1;
    Next[0] = -1;
    while(j < m)
        if(k == -1 || b[j] == b[k])
            Next[++j] = ++k;
        else
            k = Next[k];
}
int kmp(int start)
{
    int ans = 0;
    int i,j = 0;
    for(i = start; i < n; i+=q)
    {
        while(j > 0 && a[i] != b[j])
            j = Next[j];
        if(a[i] == b[j])
            j++;
        if(j == m)
        {
            ans++;
            j = Next[j];
        }
    }
    return ans;
}
int main()
{
    int t,ans,ca=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&q);
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i = 0; i < m; i++)
        {
            scanf("%d",&b[i]);
        }
        getNext();
        ans = 0;
        if((m-1)*(q-1)+m <= n)
        {
            for(int i = 0; i < q; i++)
            {
                ans += kmp(i);
            }
        }
        printf("Case #%d: %d
",++ca,ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jifahu/p/5932521.html