HDU 1711 Number Sequence

来源:互联网 发布:杭州java平均薪资 编辑:程序博客网 时间:2024/06/05 08:31

题目链接

题意:在主串中寻找第一个包含模式串的的位置。

分析:裸kmp

#include<cstdio>#include<algorithm>#include<cstring>#define MAX_P 10005#define MAX_T 1000005using namespace std;int P[MAX_P];int T[MAX_T];int NEXT[MAX_P];int n,m;void makeNext(void){    int q,k;    NEXT[0]=0;    for(q=1,k=0;q<m;q++)    {        while(k>0&&P[q]!=P[k])        k=NEXT[k-1];        if(P[q]==P[k])        k++;        NEXT[q]=k;    }    return ;}int kmp(void){    makeNext();    for(int i=0,q=0;i<n;i++)    {        while(q>0&&P[q]!=T[i])        q=NEXT[q-1];        if(P[q]==T[i])        q++;        if(q==m)        return i-m+1+1;    }    return -1;}int main(void){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)        scanf("%d",&T[i]);        for(int i=0;i<m;i++)        scanf("%d",&P[i]);        int ans=kmp();        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击