hdu1867—A + B for you again

来源:互联网 发布:yum安装ruby最新版本 编辑:程序博客网 时间:2024/06/07 15:18

传送门:点我

Sample Input
asdf sdfgasdf ghjk
 

Sample Output
asdfgasdfghjk
题意:计算两字符串相加要求1.长度优先最小 2.字典序小的顺序输出

注意:题目要求的是最短的字符串能包含所给的两个字符串,这里的包含一定是前一部分或后一部分包含,不能中间包含

#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<string>#define N 100005using namespace std;int Next[N];char ss1[N],ss2[N];int kmp(char s1[],char s2[])//s2加在s1上{    int i,j;    int len2=strlen(s2);    for(i=1,j=0; i<len2; i++)    {        while(j>0&&s2[i]!=s2[j])            j=Next[j-1];        if(s2[i]==s2[j])            j++;        Next[i]=j;    }    int len=strlen(s1);    for(j=0,i=0; i<len; i++)    {        while(j>0&&s1[i]!=s2[j])            j=Next[j-1];        if(s1[i]==s2[j])            j++;        if(j==len2)            break;    }    if((j==len2&&i==len-1)||i==len)//s1和s2一块结束和s1结束s2未结束的情况就返回j        return j;    return 0;//此情况是s2在s1中间}int main(){    char s1[N],s2[N];    int i;    while(~scanf("%s",s1))    {        scanf("%s",s2);        int len1=strlen(s1);        int len2=strlen(s2);        int k1=kmp(s1,s2);        int k2=kmp(s2,s1);        if(k1>k2||(k1==k2)&&strcmp(s1,s2)<0)//k1,k2其实就是重叠的部分        {            printf("%s",s1);            for(i=k1; i<len2; i++)                printf("%c",s2[i]);        }        else        {            printf("%s",s2);            for(i=k2; i<len1; i++)                printf("%c",s1[i]);        }        cout<<endl;    }    return 0;}


原创粉丝点击