#include <stdio.h>
#include <string.h>
int next[10005];
int  str1[1000005],str2[10005];
void build_next(int len2)
{
	int i=0,j=-1;
	next[0] = -1;
	while (i < len2)
	{
		if (j==-1 || str2[i] == str2[j])
		{
			i++;
			j++;
			if (str2[i] != str2[j])
			{
				next[i] = j;
			}
			else
				next[i] = next[j];
		}
		else
			j = next[j];
	}
}
int KMP(int len1,int len2)
{
    build_next(len2);
	int i=0,j=0,cnt;
	
	while (i < len1)
	{
		if (j==-1 || str1[i] == str2[j])
		{
			i++;
			j++;
			if(j==len2)                 //在这里判断是否为全部匹配
				return i-len2+1;
		}
		else
			j = next[j];
	}
	return -1;                                 //最后还未匹配成功,直接返回-1
}
int main()
{
	int N,n,m,i;
	scanf("%d",&N);
	while (N--)
	{
		scanf("%d%d",&n,&m);
		for(i=0;i<n;i++)
			scanf("%d",&str1[i]);
        for(i=0;i<m;i++)
			scanf("%d",&str2[i]);
		if(n<m)
			printf("-1\n");
		else
		{
			n=KMP(n,m);
		   printf("%d\n",n);
		}
	}
	return 0;
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
分析:题目将字符串换成了数字,原理还是一样的,简单KMP
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
HDU 1711 Number Sequence (简单KMP)
原文:http://blog.csdn.net/xinwen1995/article/details/46124561