hdu 1711 kmp

来源:互联网 发布:单片机ds18b20 编辑:程序博客网 时间:2024/06/06 00:10

http://acm.hdu.edu.cn/showproblem.php?pid=1711

判断b是不是a字串,输出b在a位置下标

kmp模板题

#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <string>#include <queue>#include <map>#include <iostream>#include <algorithm>using namespace std;#define RD(x) scanf("%d",&x)#define RD2(x,y) scanf("%d%d",&x,&y)#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)#define clr0(x) memset(x,0,sizeof(x))#define eps 1e-9const double pi = acos(-1.0);typedef long long LL;const int modo = 1e9 + 7;const int maxn = 1e6 + 5,maxm = 1e4 + 5;int a[maxn],b[maxm],next[maxm];int n,m;void setnext(){    int i = 0,j = -1;    next[i] = j;    while(i < m){        if(j == -1 || b[i] == b[j]){            i++;j++;            next[i] = j;        }        else{            j = next[j];        }    }    return ;}int kmp(){    int i = 0,j = 0;    setnext();    while(i < n){        if(j == -1 || a[i] == b[j]){            ++i,++j;            if(j == m)                return i - m + 1;        }        else            j = next[j];    }    return -1;}int main() {    int _;RD(_);    while(_--){        RD2(n,m);        for(int i = 0;i < n;++i){            RD(a[i]);        }        for(int i = 0;i < m;++i)            RD(b[i]);        printf("%d\n",kmp());    }    return 0;}


0 0