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不止可以用在字符串,还可以用在数字上……(笑着哭)
代码:
//Full of love and hope for life
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
//https://paste.ubuntu.com/
using namespace std;
int nex[10010];
int n[1000010],m[10010];
void getnext(int a[],int x){
int j=-1;
nex[0]=-1;
for(int i=1;i<x;i++){
if(j!=-1&&a[i]!=a[j+1]){
j=nex[j];
}
if(a[i]==a[j+1]){
j++;
}
nex[i]=j;
}
}
int kmp(int a[],int b[],int x,int y){
getnext(b,y);
int j=0;
for(int i=0;i<x;i++){
while(j!=-1&&a[i]!=b[j+1]){
j=nex[j];
}
if(a[i]==b[j+1]){
j++;
}
if(j==y-1){
return i-j+1;
}
}
return -1;
}
int main(){
//ios::sync_with_stdio(false);
int a,b,c;
scanf("%d",&a);
while(a--){
scanf("%d%d",&b,&c);
for(int i=0;i<b;i++){
scanf("%d",&n[i]);
}
for(int i=0;i<c;i++){
scanf("%d",&m[i]);
}
if(b<c){
cout << -1 << endl;
}
else{
cout << kmp(n,m,b,c) << endl;
}
}
return 0;
}
//Full of love and hope for life
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
//https://paste.ubuntu.com/
using namespace std;
int nex[10010];
int n[1000010],m[10010];
void getnext(int a[],int x){
int j=-1;
nex[0]=-1;
int i=0;
while(i<x){
if(j==-1||a[i]==a[j]){
i++;
j++;
nex[i]=j;
}
else{
j=nex[j];
}
}
}
int kmp(int a[],int b[],int x,int y){
getnext(b,y);
int j=0;
int i=0;
while(i<x&&j<y){
if(j==-1||n[i]==m[j]){
i++;
j++;
}
else {
j=nex[j];
}
}
if(j>=y){
return i-j+1;
}
else{
return -1;
}
}
int main(){
//ios::sync_with_stdio(false);
int a,b,c;
scanf("%d",&a);
while(a--){
scanf("%d%d",&b,&c);
for(int i=0;i<b;i++){
scanf("%d",&n[i]);
}
for(int i=0;i<c;i++){
scanf("%d",&m[i]);
}
if(b<c){
cout << -1 << endl;
}
else{
cout << kmp(n,m,b,c) << endl;
}
}
return 0;
}