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

来源:互联网 发布:怎样开淘宝服装网店 编辑:程序博客网 时间:2024/05/22 12:59

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
#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXSTRLEN 1000005#define OVERFLOW -2#define ERROR -1#define OK 1typedef int CElemtype;typedef int Statu;typedef struct{    CElemtype *ch;    int length;} Hstring;int next[MAXSTRLEN];int n, m;int sum = 0;Statu InitString(Hstring &T);  //初始化串Statu StrAssign(Hstring &T, CElemtype str[]); //输入串Statu StrAssign2(Hstring &T, CElemtype str[]); //输入串Statu Getnext(int s[]);Statu Kmp(Hstring T1, Hstring T2, int t);int main(){    int i, k;    int s1[MAXSTRLEN], s2[MAXSTRLEN];    Hstring T1, T2;    scanf("%d", &n);    for(i = 0; i < n; i++)        scanf("%d", &s1[i]);    scanf("%d", &m);    for(i = 0; i < m; i++)        scanf("%d", &s2[i]);    InitString(T1);    InitString(T2);    StrAssign(T1, s1);    StrAssign2(T2, s2);    Getnext(s2);    k = Kmp(T1, T2, 0);    if(k > 0)    {        int t = Kmp(T1, T2, k);        if(t > 0)            printf("-1\n");        else            printf("%d %d\n", k, k + T2.length - 1);    }    else        printf("-1\n");    return 0;}Statu InitString(Hstring &T)  //初始化串{    T.ch = (CElemtype *)malloc(MAXSTRLEN*sizeof(CElemtype));    if(!T.ch) exit(0);    T.length = 0;    return OK;}Statu StrAssign(Hstring &T, CElemtype str[]) //输入串{    int i;    for(i = 0; i < n; i++)    {        T.ch[i] = str[i];        T.length++;    }    return OK;}Statu StrAssign2(Hstring &T, CElemtype str[]) //输入串{    int i;    for(i = 0; i < m; i++)    {        T.ch[i] = str[i];        T.length++;    }    return OK;}Statu Getnext(int s[]){    int i = 0, j = -1;    next[0] = -1;    while(i < m)    {        if(j == -1 || s[i] == s[j])        {            i++;            j++;            next[i] = j;        }        else            j = next[j];    }    return OK;}Statu Kmp(Hstring T1, Hstring T2, int t){    int i = t, j = 0;    while(i < T1.length && j < T2.length)    {        if(j == -1 || T1.ch[i] == T2.ch[j])        {            i++;            j++;        }        else            j = next[j];    }    if(j >= T2.length)        return i - m + 1;    else        return ERROR;}

原创粉丝点击