資料結構實驗之串三: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; }