hdu(Number Sequence 1711)kmp

来源:互联网 发布:dota2天梯淘宝买账号 编辑:程序博客网 时间:2024/04/29 15:15

NumberSequence

TimeLimit: 10000/5000 MS(Java/Others)    MemoryLimit: 32768/32768 K (Java/Others)
Total Submission(s):5019    AcceptedSubmission(s): 2263


Problem Description
Given two sequences of numbers : a[1], a[2], ...... , a[N], andb[1], b[2], ...... , b[M] (1 <= M <=10000, 1 <= N <= 1000000). Your taskis 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 ofcases. Each case contains three lines. The first line is twonumbers N and M (1 <= M <= 10000, 1<= N <= 1000000). The second linecontains N integers which indicate a[1], a[2], ...... , a[N]. Thethird 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 Kdescribed above. If no such K exists, output -1instead.
 

Sample Input
2 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 1 3 13 5 1 2 1 2 3 1 2 3 1 32 1 2 1 2 3 2 1
 

Sample Output
6-1
 

Source
HDU 2007-Spring Programming Contest
 KMP算法(详细资料参考:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html
#include <stdio.h>#include<string.h>#include<algorithm>#define MAX 1000000using namespace std;int next[MAX];int a[MAX],b[MAX];int x,y;int kmp(){    int i=0,j=0;    while(i<x){       if(j==-1||a[i]==b[j]){           i++;           j++;       }       else           j=next[j];    if(j==y)         return i-y+1;    }    return -1;}void getnext(){    int j,k;    next[0]=-1;    j=0;    k=-1;    while(j<y-1){       if(k==-1||b[j]==b[k]){           j++;           k++;          next[j]=k;       }       else                       k=next[k];    }}int main(){    int t,i;    scanf("%d",&t);    while(t--){       scanf("%d%d",&x,&y);       memset(next,0,sizeof(next));       for(i=0;i<x;i++)          scanf("%d",&a[i]);       for(i=0;i<y;i++)          scanf("%d",&b[i]);       getnext();      //for(i=0;i<y;i++)        //  printf("%d",next[i]);       printf("%d\n",kmp());    }        return 0;}



0 0
原创粉丝点击