原题:http://acm.hdu.edu.cn/showproblem.php?pid=1711
题意:
给出两个数字串,问b串在a串中第一次出现的位置;
KMP模板题
#include<stdio.h>
#include<string.h>
const int maxn = 1e6+5;
int a[maxn], b[maxn], f[maxn];
int n, m;
void getFail()
{
f[0] = f[1] = 0;
for(int i = 1;i<m;i++)
{
int j = f[i];
while(j && b[j] != b[i])
j = f[j];
if(b[i] == b[j])
f[i+1] = j+1;
else
f[i+1] = 0;
}
}
int find()
{
int j = 0;
for(int i = 0;i<n;i++)
{
while(j && a[i]!=b[j]) j = f[j];
if(a[i] == b[j]) j++;
if(j == m)
return i-m+2;
}
return -1;
}
int main()
{
int cas;
scanf("%d", &cas);
while(cas--)
{
scanf("%d%d", &n, &m);
for(int i = 0;i<n;i++)
scanf("%d", &a[i]);
for(int i = 0;i<m;i++)
scanf("%d", &b[i]);
getFail();
int ans = find();
printf("%d\n", ans);
}
return 0;
}