链接:点击打开链接
题意:问模式串在主串中出现得到位置
代码:
#include <map>
#include <set>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=1000005;
int S[siz],T[siz],nex[siz];
void getnex(int len){
int i,j;
i=0,j=-1;
nex[0]=-1;
while(i<len){
if(j==-1||T[i]==T[j])
nex[++i]=++j;
else
j=nex[j];
}
}
int kmp(int slen,int tlen){
int i,j;
i=j=0;
getnex(tlen);
while(i<slen){
if(j==-1||S[i]==T[j])
i++,j++;
else
j=nex[j];
if(j==tlen) //kmp模板,找到就返回
return i-tlen+1;
}
return -1;
}
int main(){
int t,n,m,i,j;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&S[i]);
for(i=0;i<m;i++)
scanf("%d",&T[i]);
printf("%d\n",kmp(n,m));
}
return 0;
}