HDU 5918

来源:互联网 发布:江铠同翟天临分手知乎 编辑:程序博客网 时间:2024/04/26 15:31

(好久没写博客了,我要懒死了。。。

kmp计数。

用b去匹配a,b数组的最后一个数用一个独一无二的数表示就相当于第m+1个数匹配失败,然后就会继续匹配了,wa就wa在匹配完一个之后继续匹配上,这里要特别注意!

代码:

#include <cstdio>#include <iostream>#include <cstring>using namespace std;int n, m, p;int a[1000005];int b[1000005];int f[1000005];int ans;void make_next(){    memset(f, 0, sizeof(f));    for(int i = 1, k = 0; i < m; ++i)    {        while(k > 0 && b[i] != b[k])            k = f[k - 1];        if(b[i] == b[k])            ++k;        f[i] = k;    }}void kmp(int st){    for(int i = st, k = 0; i < n; i += p)    {        while(k > 0 && a[i] != b[k])            k = f[k - 1];        if(a[i] == b[k])            ++k;        if(i + (m - k) * p >= n)            break;        if(k == m)        {            ++ans;        }    }}int main(){    int T;    int kase = 0;    scanf("%d", &T);    while(T--)    {                ans = 0;        scanf("%d%d%d", &n, &m, &p);        for(int i = 0; i < n; ++i)        {            scanf("%d", &a[i]);        }        for(int i = 0; i < m; ++i)        {            scanf("%d", &b[i]);        }        b[m] = 0;        make_next();        for(int i = 0; i < p; ++i)        {            if(i + (m - 1) * p >= n)                break;            kmp(i);        }        printf("Case #%d: %d\n", ++kase, ans);    }}


0 0
原创粉丝点击