Problem descriptiongiven 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.
Inputthe 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,100 0000].
Outputfor each test case, You shoshould 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#include <stdio.h>int n, m;int a[1000005];int b[10005];int f[10005];void getfail(){ f[0] = 0; f[1] = 0; for (int i = 1; i < m; i++) { int j = f[i]; while (j && b[i] != b[j]) j = f[j]; f[i+1] = b[j] == b[i] ? j + 1 : 0; }}int main(){ int flag, i, j, t; scanf("%d",&t); while (t--) { scanf("%d %d",&n,&m); for (i = 0; i < n; i++) scanf("%d",&a[i]); for (i = 0; i < m; i++) scanf("%d",&b[i]); getfail(); for (i = 0;i <= m; i++) printf("%d ",f[i]); puts(""); flag = 1; j = 0; for (i = 0;i < n;i++) { while (j && b[j] != a[i]) j = f[j]; if (b[j] == a[i]) j++; if (j == m) { flag = 0; printf("%d\n",i - m + 1); } } if (flag) puts("-1"); } return 0;}