HDOJ1711 Number Sequence

来源:互联网 发布:js 颜色 编辑:程序博客网 时间:2024/05/16 07:16
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
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 3 2 1 2
1 2 3 2 1
 
Sample Output
6

-1

这个也是KMP算法的简单运用吧,只不过把字符串匹配换成了数字的匹配,个人觉得还比字符串要好处理,在码代码的时候直接把字符串的代码改了一点,但运行的时候程序异常终止,后来查了一下,我把开了1000000的数组放在main函数里的问题,原因是VC堆栈默认是1M,int a[1000000]的大小是4*1000000,将近4M,远远大于1M,编译连接的时候不会有问题,但运行是堆栈溢出,程序异常终止,最后把数组定义成全局变量,ok,通过了。

代码:

#include<iostream>using namespace std;int t[10005],s[1000005],next[10005];void getnext(int t[],int next[],int n){int i=1;int j=0;next[1]=0;while(i<n){if(j==0||t[i-1]==t[j-1]){i++;j++;next[i]=j;}elsej=next[j];}}int kmp(int s[],int t[],int next[],int a,int b){int i=1;int j=1;while(i<=a&&j<=b){if(j==0||s[i-1]==t[j-1]){i++;j++;}elsej=next[j];}if(j>b)return i-b;elsereturn 0;}int main(){int n;int a,b;cin>>n;while(n--){cin>>a>>b;for(int i=0;i<a;i++)cin>>s[i];for(int j=0;j<b;j++)cin>>t[j];getnext(t,next,b);int result=kmp(s,t,next,a,b);if(result==0)cout<<"-1"<<endl;elsecout<<result<<endl;}return 0;}


原创粉丝点击