hdu 1711 Number Sequence(完全是KMP问题)
#include <stdio.h>
#include <string.h>
#define MAXN 1000005
#define MAXM 10005
int a[MAXN],b[MAXM],next[MAXM];
void getNext(int len)
{
int j=0,k=-1;
next[0]=-1;
while(j < len)
{
if( k == -1 || b[j] == b[k] )
{
++j;
++k;
next[j]=k;
}
else k=next[k];
/* if( b[j] == b[k]) nextval[j] = nextval[ nextval[k] ];
/ else nextval[j] = k;*/
}
}
int kmp(int lena,int lenb)
{
int i=0,j=0;
while( i < lena && j < lenb )
{
if( j == -1 || a[i] == b[j] )
{
++i;
++j;
}
else j = next[j];
}
if( j < lenb ) return -1;
else return i-j+1;
}
int main()
{
int T,i,N,M;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&N,&M);
for(i=0; i<N; i++) scanf("%d",&a[i]);
for(i=0; i<M; i++) scanf("%d",&b[i]);
if(N < M) printf("-1\n");
else
{
getNext(M);
printf("%d\n",kmp(N,M));
}
}
return 0;
}
浙公网安备 33010602011771号