HDU1867 A + B for you again

来源:互联网 发布:淘宝卖家卖出多久到账 编辑:程序博客网 时间:2024/05/20 06:05

简单的KMP,两个单词链接起来,有两种连接方法,然后用next数组的特性,直接得到

比较这两个连接的字符串的自身匹配。。。。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;char a[100005],b[100005],c[200005],str1[200005],str2[200005];int next[200005];void kmp(int len){    int j=0;    memset(next,0,sizeof(next));    for(int i=1;i<len;i++)    {        while(j>0&&c[i]!=c[j])            j=next[j-1];        if(c[i]==c[j]) j++;        next[i]=j;    }}int main(){    int i,j,len,len1;    char d[]="#";    while(scanf("%s %s",b,a)!=EOF)    {        memset(c,0,sizeof(c));        memset(str1,0,sizeof(str1));        memset(str2,0,sizeof(str2));        strcpy(c,a);        strcat(c,d);        strcat(c,b);        int len2=strlen(c);        kmp(len2);        len=strlen(a);        len1=strlen(b);        int t=0;        for(i=0;i<len1-next[len2-1];i++)            str1[t++]=b[i];        for(i=0;i<len;i++)            str1[t++]=a[i];        memset(c,0,sizeof(c));        strcpy(c,b);        strcat(c,d);        strcat(c,a);        kmp(len2);        t=0;        for(i=0;i<len-next[len2-1];i++)            str2[t++]=a[i];        for(i=0;i<len1;i++)            str2[t++]=b[i];        //printf("%s\n",str1);        //printf("%s\n",str2);        len1=strlen(str1);        len2=strlen(str2);        if(len1<len2) printf("%s\n",str1);        else if(len1>len2) printf("%s\n",str2);        else        {            int ttt=strcmp(str1,str2);            if(ttt<0) printf("%s\n",str1);            else printf("%s\n",str2);        }    }    return 0;}

0 0
原创粉丝点击