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