hdu 1867 KMP A + B for you again
来源:互联网 发布:linux 文件后面带星号 编辑:程序博客网 时间:2024/04/30 04:00
//利用KMP求解,找两个字符串的前缀或者后缀相同的部分,不能是中间部分;la = KMP(str1,str2);lb = KMP(str2,str1);如果la > lb 说明找到模式串str2的//前缀与主串str1的后缀相同的部分,长度为la,公共部分是谁的后缀就先输出谁,此处时显然的;
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAX = 100010;int next[MAX];char str1[MAX],str2[MAX];void Get_NextVal(char *s){ int i = 0; int j = -1; next[0] = -1; int Len = strlen(s); while(i < Len) { if(j == -1 || s[i] == s[j]) { ++i,++j; next[i] = j; } else j = next[j]; }}int KMP(char *s1, char *s2){ int i = 0; int j = 0; int Len1 = strlen(s1); int Len2 = strlen(s2); Get_NextVal(s2); while(i < Len1 && j < Len2) { if(j == -1 || s1[i] == s2[j]) { ++i; ++j; } else j = next[j]; } if(i >= Len1 ) return j; return 0;}int main(){ while(~scanf("%s%s",str1,str2)) { int la = KMP(str1, str2); int lb = KMP(str2, str1); if(la == lb) if(strcmp(str1,str2) < 0) cout<<str1<<str2+la<<endl; else cout<<str2<<str1+lb<<endl; else if(la < lb) cout<<str2<<str1+lb<<endl; else cout<<str1<<str2+la<<endl; } return 0;}