首页 > 代码库 > HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)

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

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

  代码如下:

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;#define N 1000005int 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\n",++ca,ans);    }    return 0;}

 

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