hdu 5918 (kmp变形)

来源:互联网 发布:新疆用什么软件约 编辑:程序博客网 时间:2024/06/02 07:15

简单的改一下Kmp,如果看不懂,可以去复习一下kmp

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define maxn 2000500typedef long long int ll;int T;int n , m , p;int a[maxn] , b[maxn];int nxt[maxn];void get_next(){    memset(nxt,0,sizeof(nxt));    int i = 0  , j = -1;    nxt[0] = -1;    while( i < m )    {        if( j == -1 || b[j] == b[i] )        {            i++;            j++;            nxt[i] = j;        }        else j = nxt[j];    }}int kmp(int x){    int i = x , j = 0;    while( i < n  )    {        if( j == -1 || a[i] == b[j] )        {            i+=p;            j++;        }        else return 0;        if( j == m )        {            return 1;        }    }    return 0;}int main(){    int cas = 0;    cin >> T;    while(T--)    {        cin >> 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]);        }        get_next();        int ans = 0;        for(int i = 0; i+p*(m-1) < n; i++)        {            if( kmp(i) )ans++;        }        printf("Case #%d: %d\n",++cas,ans);    }}

原创粉丝点击