text作为文本串,pat作为模板串,nxt作为失配函数
求失配边的过程,是模板串用自己匹配自己的过程。
匹配的过程,从两个串的第一个元素开始尝试匹配,如果当前位置匹配成功或者在失配
的情况下退无可退,则同时前进一个单位,否则沿着失配边走。
char text[maxn],pat[maxn]; int nxt[maxn]; void get_next(char *s) { int i=0,j=-1,len=strlen(s); nxt[0]=-1; while(i<len) { if(j==-1||s[i]==s[j]) { i++; j++; nxt[i]=j; } else j=nxt[j]; } } int kmp() { int len1=strlen(text),len2=strlen(pat); int i=1,j=0; while(i<len1&&j<len2) { if(j==-1||text[i]==pat[j]) { i++,j++; } else j=nxt[j]; } if(j>=len2) return i-len2; else return -1; }