hdu1711 KMP

来源:互联网 发布:c语言经典编程282例pdf 编辑:程序博客网 时间:2024/05/20 18:20

KMP最裸的题目。。。

注意输入的是数字,不是字符。

代码:

#include <iostream>#include <cstring>#include <cstdio>using namespace std;int s1[1000001];int s2[10001];int p[10001];int n,m;void getnext(){    int j=0;    for (int i=2;i<=m;i++)    {        j=p[i-1];        while (j>0&&s2[j+1]!=s2[i])            j=p[j];        if (s2[j+1]==s2[i])            j=j+1;        p[i]=j;    }}int main(){    int r;    scanf("%d",&r);    while (r--)    {        p[0]=p[1]=0;        scanf("%d%d",&n,&m);        for (int i=1;i<=n;i++)            scanf("%d",&s1[i]);        for (int i=1;i<=m;i++)            scanf("%d",&s2[i]);        getnext();        int j=1,i;        for (i=1;i<=n&&j<=m;i++,j++)        {            if (s1[i]==s2[j])                continue;            j--;            while (s1[i]!=s2[j+1]&&j>0)                j=p[j];            if (s1[i]!=s2[j+1])                j--;            j++;        }        if (j<m)            printf("-1\n");        else            printf("%d\n",i-j+1);    }}


0 0
原创粉丝点击