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;}

原创粉丝点击