hdu1005 Number Sequence(kmp字符串比较)
2018-01-19 19:44
411 查看
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
Sample Output
, 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
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int ne[10010]; int a[1000010], b[10010]; void GetNext(int lenb) { int i = 0, j = -1; ne[0] = -1; while(i < lenb) { if(j == -1 || b[i] == b[j]){ ne[++i] = ++j; } else j = ne[j]; } } int KmpCompare(int lena, int lenb) { int i = 0, j = 0; while(i < lena && j < lenb) { if(j == -1 || a[i] == b[j]){ i++; j++; if(j == lenb) return i - j + 1; } else j = ne[j]; } return -1; } int main() { int t, c, d, e, i; scanf("%d", &t); while(t--) { scanf("%d %d", &c, &d); for(i=0; i<c; i++){ scanf("%d", &a[i]); } for(i=0; i<d; i++){ scanf("%d", &b[i]); } GetNext(d); e = KmpCompare(c, d); printf("%d\n", e); } return 0; }
相关文章推荐
- KMP的创造next数组代码及常用的字符串比较代码
- hdu1358 Period(kmp字符串比较)
- hdu2087 剪花布条(kmp字符串比较)
- poj2752 Seek the Name, Seek the Fame (kmp字符串比较)
- KMP 算法 字符串比较
- hdu3336 Count the string(kmp字符串比较)
- BM算法模式匹配——字符串与KMP比较
- BM算法模式匹配——字符串与KMP比较
- 一起谈.NET技术,总结字符串比较函数
- hdu 1686 比较 hdu 2087 深入了解KMP
- 两个字符串比较,取出重复字符个数。 (原创)
- Sting比较的“==”和“equals”的区别(字符串缓冲池)
- 比较汉字首字母按照字母表顺序排列汉字字符串
- 【kmp】hdu1171 Number Sequence
- HDU 1711 Number Sequence(KMP)
- sqlserver2000中字符串类型的日期如何比较大小
- 中文字符串是怎么比较大小的?
- C++不定长字符串比较合理且简单的解决方法
- Oracle 字符串比较大小
- java学习笔记-String-字符串之间的比较