裸题,直接匹配一遍
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define M 10007
#define N 1000007
using namespace std;
int s[N],p[M];
void get_next ( int p[] , int next[] , int m)
{
int i = 1 , k = -1;
next[1] = 0;
while ( i <= m )
if ( !k || p[i] == p[k] )
i++,k++,next[i] = k;
else k = next[k];
}
int match ( int s[] , int p[] , int n , int m)
{
int next[M];
get_next ( p , next , m );
int i = 1 , j = 1;
while ( i <= n )
{
if ( !j || s[i] == p[j] ) i++,j++;
else j = next[j];
if ( j == m+1 ) return i-m;
}
return -1;
}
int t,n,m;
int main ( )
{
scanf ( "%d" , &t );
while ( t-- )
{
scanf ( "%d%d" , &n , &m );
for ( int i = 1; i <= n; i++ )
scanf ( "%d" , &s[i] );
for ( int i = 1; i <= m; i++ )
scanf ( "%d" , &p[i] );
printf ( "%d\n" , match ( s , p , n , m ) );
}
}