hdu2594Simpsons’ Hidden Talents
方法1:
用KMP不是完全匹配也没事,把第一个当成模式串,第二个当成主串,比到最后就可以得到最后的状态的j,也就是最大匹配数。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 50010 char s1[maxn],s2[maxn]; int next[maxn],len1,len2; void getnext() { int i=0,j=-1; next[0]=-1; while(i<len2) { if(j==-1||s2[i]==s2[j]) { i++,j++; next[i]=j; } else j=next[j]; } } int kmp() { int i=0,j=0; while(i<len1&&j<=len2) { if(j==-1||s1[i]==s2[j]) i++,j++; else j=next[j]; } return j;//此时的j是当i==len1时的j; } int main() { while(scanf("%s%s",&s2,&s1)!=EOF) { len1=strlen(s1); len2=strlen(s2); memset(next,0,sizeof(next)); getnext(); int n=kmp(); for(int i=0;i<n;i++) printf("%c",s2[i]); if(n)printf(" "); printf("%d\n",n); } return 0; }
方法2:
就是连接串1和串2,得到next[]函数,直接得到的next[len3]就是两个串的首尾相同的最大,利用next[]的性质,让我对KMP有了更深度的理解,加油!!!!
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 50010 char s1[maxn],s2[maxn],s3[2*maxn]; int next[2*maxn],len1,len2,len3; void getnext() { int i=0,j=-1; next[0]=-1; while(i<len3) { if(j==-1||s3[i]==s3[j]) { i++,j++; next[i]=j; } else j=next[j]; } } int main() { while(scanf("%s%s",&s1,&s2)!=EOF) { len1=strlen(s1); len2=strlen(s2); len3=len1+len2; strcpy(s3,s1); strcat(s3,s2); memset(next,0,sizeof(next)); getnext(); if(next[len3]) { if(next[len3]>len1||next[len3]>len2) { if(len1>len2)printf("%s %d\n",s2,len2); else printf("%s %d\n",s1,len1); } else { for(int i=0;i<next[len3];i++) printf("%c",s3[i]); printf(" %d\n",next[len3]); } } else printf("0\n"); } return 0; }

浙公网安备 33010602011771号