1. 程式人生 > >資料結構實驗之串三:KMP應用

資料結構實驗之串三:KMP應用

Problem Description

有n個小朋友,每個小朋友手裡有一些糖塊,現在這些小朋友排成一排,編號是由1到n。現在給出m個數,能不能唯一的確定一對值l和r(l <= r),使得這m個數剛好是第l個小朋友到第r個小朋友手裡的糖塊數?

Input

首先輸入一個整數n,代表有n個小朋友。下一行輸入n個數,分別代表每個小朋友手裡糖的數量。

之後再輸入一個整數m,代表下面有m個數。下一行輸入這m個數。

Output

 如果能唯一的確定一對l,r的值,那麼輸出這兩個值,否則輸出-1

Sample Input

5
1 2 3 4 5
3
2 3 4

Sample Output

2 4

#include <stdio.h> #include <stdlib.h> int n,m; int a[1000001],b[1000001]; int next[1000001]; void get_next(int str[]) {     int i=0,j=-1;     next[0]=-1;     while(i<=m-1)     {         if(j==-1||str[i]==str[j])         {             i++;             j++;             next[i]=j;         }         else j=next[j];     } } int KMP(int x) {     int i=x,j=0;     while(i<=n-1&&j<=m-1)     {         if(j==-1||a[i]==b[j])         {             i++;             j++;         }         else j=next[j];     }     if(j==m) return (i-(m-1));     else return -1; } int main() {     scanf("%d",&n);     int i;     for(i=0; i<=n-1; i++) scanf("%d",&a[i]);     scanf("%d",&m);     for(i=0; i<=m-1; i++) scanf("%d",&b[i]);     get_next(b);     int k;     k=KMP(0);     if(k!=-1)     {         int c;         c=KMP(k);         if(c==-1) printf("%d %d\n",k,k+(m-1));         else printf("%d\n",-1);     }     else printf("%d\n",-1);     return 0; }