标签:
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int next[50005]; char s[50005],t[50005]; void getnext()//next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀。 { int i=0,k=-1; next[0]=-1; int len=strlen(s); while(i<len) { if(s[i]==s[k]||k==-1) { i++; k++; next[i]=k; } else k=next[k]; } /* for(int j=0;j<=len;j++) printf("%d ",next[j]); printf("\n"); 输出next数组*/ } void kmp() { int i=0,j=0; int lens=strlen(s); int lent=strlen(t); while(i<lent&&j<lent) { if(s[j]==t[i]||j==-1) { i++; j++; } else j=next[j]; } if(!j) printf("0\n"); else { s[j]=‘\0‘; printf("%s %d\n",s,j); } } int main() { while(scanf("%s%s",s,t)>0) { getnext(); kmp(); } return 0; } /*思路:这题是有两个字符串,要第一个字符串的最长前缀等于第二个字符串的最长后缀。 这样,根据kmp中next的特性,可以将第一个字符串当作模式串(因为要求它的最长前缀), 第二个字符串当作主串,对两者进行kmp匹配。这样,当主串的i不断往后,而j要是都不匹配的话, 会在-1和0之间往复,当i到了主串后面,开始和模式串匹配时,就可以根据next函数的特性来判断出前缀与后缀相等的最长长度。*/
标签:
原文地址:http://www.cnblogs.com/yuyixingkong/p/4415668.html