hdu 1711

来源:互联网 发布:cassandra 数据库设计 编辑:程序博客网 时间:2024/05/29 23:47

KMP入门题

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711

很久以前就接触了KMP,但那时还没有做题,差不多都忘了.....

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 code:

#include<iostream>#include<stdio.h>using namespace std;int a[1000005],b[10005];int nextval[10005];void get_next(int b[],int m){int i=0;nextval[0]=-1;int j=-1;while(i<m){ if(j==-1||b[i]==b[j]) {++i;++j;  if(b[i]==b[j])  nextval[i]=nextval[j];  else  nextval[i]=j;}elsej=nextval[j];   }}int KMP(int a[],int n,int b[],int m,int nextval[],int pos){int i=pos;int j=0;while(i<n&&j<m){if(j==-1||a[i]==b[j]){++i;++j;}elsej=nextval[j];    }   if(j>=m)   return i-j+1;   else   return -1;}int main(){int test,n,m,i,j;scanf("%d",&test);while(test--){ 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]); get_next(b,m); cout<<KMP(a,n,b,m,nextval,0)<<endl;}}



原创粉丝点击