KMP algorithm
#include <bits/stdc++.h>using namespacestd;intnext[ +];voidMakenext (Const CharP[],intnext[]) { intq,k; intlen=strlen (P); next[0]=0; for(q=1, k=0; q<len;q++) { while(k>0&&p[q]!=P[k]) {k=next[k-1]; } if(p[q]==P[k]) {k++; } Next[q]=K; }}voidKMP (Const CharP[],Const CharQ[],intnext[]) { intLen1,len2; intq,k; Len1=strlen (P); Len2=strlen (Q); Makenext (Q,next); for(q=0, k=0; q<len1;q++) { while(k>0&&p[q]!=Q[k]) {k=next[k-1]; } if(p[q]==Q[k]) {k++; } if(k==len2) {printf ("%d\n", q-len2+1); } }}intMain () {Charp[ -]=("ASDFGASBNASLK"); Charq[ -]=("Ababab"); KMP (P,q,next); intn=strlen (Q); for(intI=0; i<n;i++) {printf ("%d", Next[i]); } printf ("\ n"); return 0;}
Application of KMP algorithm
///http://poj.org/problem?id=2406///To seek the least-follow link///understanding and application of next array//#include <bits/stdc++.h>#include <iostream>#include<string.h>#include<stdio.h>using namespacestd;Chara[1000009];intnext[1000009];voidMakenext (Const CharP[],intnext[]) { intq,k; intlen=strlen (P); next[0]=0; for(q=1, k=0; q<len;q++) { while(k>0&&p[q]!=P[k]) {k=next[k-1]; } if(p[q]==P[k]) {k++; } Next[q]=K; }}intMain () { while(SCANF ("%s", a) &&strcmp (A,".")!=0) { intL=strlen (a); Makenext (A,next); if(L% (l-next[l-1])==0) printf ("%d\n", l/(l-next[l-1])); Elseprintf ("1\n"); } return 0;}
KMP algorithm and application of KMP algorithm (POJ2406)