/*
题意描述:给出数列a和数列b,问数列a中是否存在与数列b匹配的子列
方法:KMP算法的应用
*/
#pragma warning(disable:4786)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<sstream>
#define LL long long
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define lson l,m,x<<1
#define rson m+1,r,x<<1|1
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps=1e-8;
const int maxn = 1e6 + 5;
const int maxs = 1e4 + 5;
int a[maxn] , b[maxs],f[maxs];
int n , m;
void getFail( int * b , int * f)
{
f[1] = 1; f[2] = 1;
for(int i = 2 ; i <= m ; i++){
int j = f[i];
while( j != 1&& b[i] != b[j])
j = f[j] ;
if(b[i] == b[j]) f[i + 1] = j + 1;
else f[i + 1] = 1;
}
return ;
}
void KMP(int * a , int * b , int *f)
{
bool ok = 0 ;
getFail( b , f );
int j = 1;
for(int i = 1 ; i<= n ; i++){
while(j != 1 && a[i] != b[j]) j = f[j];
if(a[i] == b[j]) ++j;
else j = 1;
if(j == m + 1){
ok = 1;
printf("%d\n" , i - m + 1);
break;
}
}
if(!ok){
printf("-1\n");
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
mem(f , 0);
scanf("%d %d",&n,&m);
FOR(i , 1, n) scanf("%d",&a[i]);
FOR(i , 1, m) scanf("%d",&b[i]);
KMP( a , b , f);
}
return 0;
}
hdu1711 number sequence KMP
最新推荐文章于 2021-03-01 20:47:37 发布