HDU1711 Number Sequence(KMP算法模板题)

xiaoxiao2021-02-28  49

Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one. Input The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000]. Output For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead. Sample Input 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 Sample Output 6

-1

题意大致是比较两个字符串,判断第二个字符串是否是第一个字符串的子串,是则输出起始的下标否则输出-1。

//KMP算法 #include <stdio.h> #include <string.h> #define N 1111111 long int next[N]; long int p[N],q[N]; long int len_p,len_q; void getnext(long int *p) { long int i=0,k=-1; next[0]=-1; while (i<len_p){ if (k==-1||p[i]==p[k]) next[++i]=++k; else k=next[k]; //printf ("%d %d %d\n",next[i],i,k); } } int KMP(long int *q,long int *p) { long int i=0,j=0,k; getnext(p); while (i<len_q&&j<len_p){ if (j==-1||q[i]==p[j]){ i++;j++; } else j=next[j]; } if (j==len_p) return i-j+1; return -1; } int main () { long int i,n,j; scanf ("%d",&n); while (n--){ scanf ("%ld%ld",&len_q,&len_p); for (i=0;i<len_q;i++) scanf ("%ld",&q[i]); for (i=0;i<len_p;i++) scanf ("%ld",&p[i]); printf ("%ld\n",KMP(q,p)); memset(p,0,sizeof(p)); memset(q,0,sizeof(q)); memset(next,0,sizeof(next)); } return 0; }

其中next的意义是其数组下标i。对应的长度为i的那部分的字符串的前缀集合和后缀集合的交集的最长元素的长度。

关于KMP算法详见:

如何更好的理解和掌握 KMP 算法? - 海纳的回答 - 知乎https://www.zhihu.com/question/21923021/answer/281346746

KMP算法理解起来是比较难了,代码也不长,建议直接背下来,等以后知识储备量大或者用多了也许就理解了呢

转载请注明原文地址: https://www.6miu.com/read-2626991.html

最新回复(0)