纯粹模板,没什么好说的
Number Sequence
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 24 Accepted Submission(s) : 14
2 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 1 3 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 2 1
6 -1
#include <iostream>
using namespace std;
const int maxt=1000001;
const int maxp=10001;
int p[maxp],t[maxt],nextval[maxp];
int n,m;
void get_nextval()
{
int i,j;
nextval[1]=0;
i=1,j=0;
while(i<m)
{
if(j==0||p[i]==p[j])
{
i++;
j++;
if(p[i]!=p[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
int match()
{
int i,j;
i=1,j=1;
while(i<=n&&j<=m)
{
if(j==0||t[i]==p[j])
{
i++;
j++;
}
else j=nextval[j];
}
if(j==m+1) return i-m;
else return -1;
}
int main()
{
int ncas,i;
scanf("%d\n",&ncas);
while(ncas--)
{
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&t[i]);
for(i=1;i<=m;i++)
scanf("%d",&p[i]);
get_nextval();
printf("%d\n",match());
}
return 0;
}