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

来源:互联网 发布:淘宝天猫优惠券好做吗 编辑:程序博客网 时间:2024/06/16 14:22

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

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

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

Author

windream
#include <stdio.h>#include <string.h>int st1[2000000],st2[2000000],next[2000000],n,m;void nex(){    int i=0,j=-1;    next[0]=-1;    while(i<n-1)    {        if(j==-1||st1[i]==st1[j])        {            i++;            j++;            next[i] = j;        }        else            j=next[j];    }}int kmp(int x1,int x2){    if(n==0||m==0)        return -1;    nex();    int i=x1,j=x2;    while(i<n&&j<m)    {        if(j==-1||st1[i]==st2[j])        {            i++;            j++;        }        else            j=next[j];    }    if(j==m)    {        return i-j+1;    }    else        return -1;}int main(){    scanf("%d",&n);    for(int i=0; i<n; i++)    {        scanf("%d",&st1[i]);    }    scanf("%d",&m);    for(int i=0; i<m; i++)    {        scanf("%d",&st2[i]);    }    int t1=kmp(0,0);    if(t1==-1)        printf("-1\n");    else //尽量不要把第二次判断写在KMP函数中(没有终止边界?)    {        int t2=kmp(t1,0);        if(t2==-1)            printf("%d %d\n",t1,t1+m-1);        else            printf("-1\n");    }    return 0;}



原创粉丝点击