题目链接:
https://vjudge.net/contest/70325#problem/A
题目大意:
给定两个数字串,第一个为待匹配串,第二个为模式串,求模式串第一个在待匹配串中出现的下标,没有则返回-1
分析:
简单修改KMP模板即可应用到数字串匹配上
代码:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[1000009],b[10009];
int n,m,Next[10009];
int pos;
void cover()
{
int i , j = 0;
Next[0] = Next[1] = 0;
for (int i = 1; i < m ; i ++)
{
while (j&&b[i]!=b[j]) j = Next[j];
if (b[i]==b[j]) ++j;
Next[i+1] = j;
}
return ;
}
int kmp()
{
int j = 0;
for (int i = 0 ; i < n ; i ++)
{
while (j&&a[i]!=b[j]) j = Next[j];
if (a[i]==b[j]){
if (j==m-1)
return i - j + 1;
++j;
}
}
return -1;
}
int main(){
int T;
scanf("%d",&T);
while (T--)
{
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]);
cover();
printf("%d\n",kmp());
}
}