tjut 5918

来源:互联网 发布:gta5捏脸数据女爱丽丝 编辑:程序博客网 时间:2024/05/22 17:21
#include <iostream>#include <cstring>#include <stdio.h>#include <stdlib.h>#include <algorithm>using namespace std;const int N = 1000002;int Next[N];int A[N],S[N], T[N];int slen, tlen;void getNext(){    int j, k;    j = 0; k = -1; Next[0] = -1;    while(j < tlen)        if(k == -1 || T[j] == T[k])            Next[++j] = ++k;        else            k = Next[k];}/*返回模式串在主串S中出现的次数*/int KMP_Count(){    int ans = 0;    int i, j = 0;    if(slen == 1 && tlen == 1)    {        if(S[0] == T[0])            return 1;        else            return 0;    }    for(i = 0; i < slen; i++)    {        while(j > 0 && S[i] != T[j])            j = Next[j];        if(S[i] == T[j])            j++;        if(j == tlen)        {            ans++;            j = Next[j];        }    }    return ans;}int main(){    int tcase,t=1;    scanf("%d",&tcase);    while(tcase--)    {        int n,k;        scanf("%d%d%d",&n,&tlen,&k);        memset(T,0,sizeof(T));        for(int i=0;i<n;i++) scanf("%d",&A[i]);        for(int i=0;i<tlen;i++) scanf("%d",&T[i]);        int ans = 0;        getNext();        for(int i=0;i<k;i++){ ///枚举起点            slen = 0;            for(int j = i;i+(tlen-1)*k<n&&j<n;j+=k){                S[slen++] = A[j];            }            if(slen<tlen) continue;            /*for(int j=0;j<slen;j++){                printf("%d ",S[j]);            }*/            ans+=KMP_Count();        }        printf("Case #%d: %d\n",t++,ans);    }    return 0;}

0 0