Number Sequence

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 28715    Accepted Submission(s): 12063

Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.

Input The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].

Output For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.

Sample Input
`213 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 1 313 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 2 1`

Sample Output
`6-1`
題意：找到s2在s1中第一次出現的位置，沒有找到輸出-1

`#include<stdio.h>#define inf 99999999#define N 1100000#define M 11000int a[N],b[M];int next[M];int kmp(int a[],int b[],int next[])//找到s2第一次在s1中出現的位置 {int j,k,i;j = 0;k = -1;next[0] = -1;while(b[j]!=inf)//建立next數組 {while(k!=-1&&b[k]!=b[j]){k = next[k];}j++;k++;if(b[k]!=b[j])next[j] = k;elsenext[j] = next[k];}i = j = 0;while(a[i]!=inf){if(b[j] == inf)return i-j+1;//第一次出現就返回在s1中的下標 else{while(j != -1&&a[i]!=b[j])j = next[j];i++;j++;}}if(b[j] == inf)//判斷s2是否為s1數組的后綴 return i-j+1;return -1;//不存在返回-1 }int main(){int t,i,j,n,m;scanf("%d",&t);while(t --){scanf("%d%d",&n,&m);for(i = 0; i < n; i ++)scanf("%d",&a[i]);for(j = 0; j < m; j++)scanf("%d",&b[j]);a[i] = b[j] = inf;//設置截止符 printf("%d\n",kmp(a,b,next));}return 0;}`