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

来源:互联网 发布:淘宝店标图片制作 编辑:程序博客网 时间:2024/04/27 15:15


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


Time Limit: 1000MS Memory limit: 65536K

题目描述

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

输入

首先输入一个整数n,代表有n个小朋友。(0

输出

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

示例输入

51 2 3 4 532 3 4

示例输出

2 4



#include <stdio.h>#include <stdlib.h>int a[100000010],b[100000010];int next[100000010];void getnext(int b[], int m){    int i=0;    next[0]=-1;    int j=-1;    while(i<m)    {        if(j==-1||b[i]==b[j])        {            i++;            j++;            next[i]=j;        }        else j=next[j];    }}int kmp(int a[], int b[], int m, int n){    int i=0, j=0;    getnext(b, m);    while(i<n&&j<m)    {        if(j==-1||a[i]==b[j])        {            i++;            j++;        }        else j=next[j];    }    if(j>=m) return i;    else        return -1;}int main(){    int n, m, i;    scanf("%d", &n);    for(i=0; i<n; i++)        scanf("%d", &a[i]);    scanf("%d", &m);    for(i=0;i<m;i++)        scanf("%d", &b[i]);   int e = kmp(a, b, m, n);    if(e==-1) printf("%d", e);    else //注意题目中的唯一    {        int t = kmp(a+e, b, m, n);//看是否有重复的子串        if(t==-1)            printf("%d %d", e-m+1, e);        else            printf("-1");    }    return 0;}


0 0