HDOJ1711 Number Sequence
2013-04-24 21:27
246 查看
Description
Given two sequences of numbers : a[1], a[2], ...... , a
, 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
.
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,通过了。
代码:
Given two sequences of numbers : a[1], a[2], ...... , a
, 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
.
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; } else j=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++; } else j=next[j]; } if(j>b) return i-b; else return 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; else cout<<result<<endl; } return 0; }
相关文章推荐
- 匹配串HDOJ 1711 Number Sequence(KMP)
- hdoj 1711 Number Sequence 【KMP】
- hdoj1711-- Number Sequence(KMP模板)
- hdoj-1711 Number Sequence(数组Kmp)
- HDOJ---1711 Number Sequence[KMP模版]
- [HDOJ1711]Number Sequence
- HDOJ-1711 Number Sequence (kmp模板)
- [HDOJ 1711] Number Sequence [KMP]
- ACM HDOJ 1711 (Number Sequence)
- hdoj 1711 Number Sequence 【kmp】
- HDOJ 1711 Number Sequence (KMP)
- 【KMP】 HDOJ 1711 Number Sequence
- hdoj 1711 Number Sequence【kmp(数字数组)】
- HDOJ 1711 Number Sequence
- hdoj1711(KMP模板题)Number Sequence
- HDOJ 1711 Number Sequence
- HDOJ1711 Number Sequence(kmp)
- HDOJ-1711 Number Sequence
- hdoj 1711 Number Sequence 【KMP】
- HDOJ 1711 Number Sequence(KMP)