HDU 1711 Number Sequence (KMP模板题)

来源:互联网 发布:淘宝千人千面影响 编辑:程序博客网 时间:2024/06/06 16:30

Number Sequence


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


分析:KMP算法模板题。具体见代码

AC代码:

#include<cstdio>#include<cstring>using namespace std;const int maxn1=1e6+10;const int maxn2=1e4+10;int a[maxn1];int b[maxn2];int next[maxn2];int N,M;void get_next(){next[0]=0;int k=0;for(int p=1;p<M;p++){while(k>0 && b[k]!=b[p]){k=next[k-1];}if(b[k]==b[p])k++;next[p]=k;}}void KMP(){get_next();int k=0;int i=0;   while(k<M && i<N){    if(a[i]==b[k]){    i++;k++;}  else if(k==0)    //当匹配长度为0时         i++;  else        k=next[k-1];}if(k==M)printf("%d\n",i-M+1);else printf("-1\n");}int main(){int T;scanf("%d",&T);while(T--){scanf("%d%d",&N,&M);for(int i=0;i<N;i++)scanf("%d",&a[i]);for(int i=0;i<M;i++)scanf("%d",&b[i]);KMP();}return 0;}




1 0
原创粉丝点击