http://acm.hdu.edu.cn/showproblem.php?pid=1711
是一道kmp的裸题,直接套kmp的模版就可以了。
注意到题目的下标是从1开始的就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
/*
created on : 2014-6-19 03:30:12
by : dezhonger
*/
#define rep(i, n) for(i = 0; i < n; i++)
int a[1000010], b[10010], f[10010];
int n, m, flag;
void getfail(int *p, int *f)
{
f[0] = 0;
f[1] = 0;
for( int i = 1; i < m; i++ )
{
int j = f[i];
while(j && p[i] != p[j] ) j = f[j];
f[i + 1] = p[i] == p[j] ? j + 1: 0;
}
}
void find(int *t, int *p, int *f)
{
int i;
getfail(p, f);
int j = 0;
rep(i, n)
{
while(j && p[j] != t[i]) j = f[j];
if( p[j] == t[i] ) j++;
if(j == m)
{
printf("%d\n", i - m + 1 + 1);
flag = 1;
return ;
}
}
}
int main()
{
int T, i;
cin >> T;
while(T--)
{
flag = 0;
cin >> n >> m;
rep(i, n) cin >> a[i];
rep(i, m) cin >> b[i];
find(a, b, f);
if(!flag) cout << "-1" << endl;
}
return 0;
}