SDUT 3311 数据结构实验之串三:KMP应用

来源:互联网 发布:php prematch 编辑:程序博客网 时间:2024/05/24 00:47

数据结构实验之串三:KMP应用

Time Limit: 1000MSMemory Limit: 65536KB
SubmitStatistic Discuss

Problem Description

有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?

Input

首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。

之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。

Output

 如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1

Example Input

51 2 3 4 532 3 4

Example Output

2 4

Hint

#include<cstdio>#include<cstring>using namespace std;int father[99999999],son[99999999],next[99999999];void getnext(int *son,int *next,int m){    int j,k;    j=0;k=-1;    next[0]=-1;    while(j<m-1)    {        if(k==-1||son[j]==son[k])        {            j++;k++;            next[j]=k;        }        else k=next[k];    }}int kmp(int *f,int *s,int n,int m){    int i=0,j=0;    getnext(s,next,m);    while(i<n&&j<m)    {        if(j==-1||f[i]==s[j])        {            i++;            j++;        }        else j=next[j];    }    if(j>=m)        return (i-m+1);    else        return -1;}int main(){    int n,m;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)            scanf("%d",&father[i]);        scanf("%d",&m);        for(int i=0;i<m;i++)            scanf("%d",&son[i]);        int y=kmp(father,son,n,m);        int left,right;        if(y!=-1)        {            int x=kmp(father+y,son,n,m);            if(x==-1)//来确模式串在目标串中是唯一的!!!            {                left=y;                right=y+m-1;                printf("%d %d\n",left,right);            }            else printf("-1\n");        }        else            printf("-1\n");    }    return 0;}