KMP(HDU1711)

#include <stdio.h>

#define MAXMSLEN 1000000
#define MAXTSLEN 10000
int ms_len, ts_len;
int ms[MAXMSLEN], ts[MAXTSLEN], next[MAXTSLEN];

void GetNext(void)
{
int i, j;
i
= 0;
next[
0] = j = -1;
while(i < ts_len)
{
if(j == -1 || ts[i] == ts[j])
{
++i;
++j;
if(ts[i] != ts[j])
next[i]
= j;
else
next[i]
= next[j];
}
else
j
= next[j];
}
}

int KMP(void)
{
int i, j;
i
= j = 0;
while(i < ms_len && j < ts_len)
{
if(j == -1 || ms[i] == ts[j])
{
++i;
++j;
}
else
j
= next[j];
}
if(j == ts_len)
return i - ts_len + 1;
else
return -1;
}

int main(void)
{
int i, t;
scanf(
"%d", &t);
while(t--)
{
scanf(
"%d %d", &ms_len, &ts_len);
for(i = 0; i < ms_len; ++i)
scanf(
"%d", &ms[i]);
for(i = 0; i < ts_len; ++i)
scanf(
"%d", &ts[i]);
GetNext();
printf(
"%d\n", KMP());
}
return 0;
}

 

posted @ 2010-10-07 15:58  penink  阅读(139)  评论(0)    收藏  举报