题意:给两个串a,b;求b在a中首次出现的位置,若没有則输出-1;

 #include<iostream>
#include<vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <math.h>
#include<algorithm>
#define ll long long
#define eps 1e-8
using namespace std; int nexts[];
int str[],b[]; void pre_nexts(int m)
{
memset(nexts,,sizeof(nexts));
int j = ,k = -;
nexts[] = -;
while(j < m)
{
if(k == - || b[j] == b[k]) nexts[++j] = ++k;
else k = nexts[k];
}
}
int KMP(int n,int m)
{
int i,j = ;
for(i = ; i < n; )
{
if(str[i] == b[j])
{
if(j == m-) return i - (m - )+;//匹配成功,返回起始坐标
i++,j++;
}
else
{
j = nexts[j];
if(j == -) { i++,j = ;}//否则重新匹配
}
}
return -;
}
int main(void)
{
int t,i,m,n;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
for(i = ; i < n; i++)
scanf("%d",&str[i]);
for(i = ; i < m; i++)
scanf("%d",&b[i]);
if(n < m) { printf("-1\n"); continue;}//细节
pre_nexts(m);
printf("%d\n",KMP(n,m));
}
return ;
}
05-11 19:33