题意描述不太好,说好是A+B,却可以B+A,虽然理论上是这样,但我觉得题意说清楚些比较好
我的做法和网上的题解不一样,比如asdf sdfg
我把第一个字符串接在第二个的后面,形成
sdfgasdf,长度一共为8,然后找next【8】,next【8】就是最长公共串的长度(为什么是这样,请看题解poj 2752)
然后把第二个字符串接在第一个的后面,再找下,
最后对比下哪个长点,就输出哪个,有个东西不好处理,aaaaaaaa aaa
如果是这样的话,直接输出较长的
#include<stdio.h>
#include<string.h>
#include<cstring>
#define val 100005
int lens,lenp,next[val*2],lenv,Min;
char s[val],p[val],an[val*2];
bool in[val*2];
int set_next();
int main()
{
int i,temp,first,second;
while(scanf("%s",s)!=EOF)
{
scanf("%s",p);
lenp=strlen(p);
lens=strlen(s);
Min=lenp<lens?lenp:lens;
lenv=lenp+lens;
strncpy(an,p,lenp);
strncpy(an+lenp,s,lens);
set_next();
first=set_next();//p在前
/* for(i=0;i<=lenv;i++)
printf("%d ",next[i]);*/
strncpy(an,s,lens);
strncpy(an+lens,p,lenp);
second=set_next();//s在前
// printf("FIRST:%d sec:%d\n",first,second);
if(first==second)
{
if(strncmp(s,p,Min)==0)
{
if(Min==lenp) puts(s);
else puts(p);
continue;
}
if(strcmp(p,s)<0)
printf("%s%s\n",p,s+second);
else printf("%s%s\n",s,p+second);
}
else if(first>second)
{
printf("%s%s\n",s,p+first);
}
else
printf("%s%s\n",p,s+second);
memset(s,0,sizeof(s));
memset(p,0,sizeof(p));
}
return 0;
}
int set_next()
{
int k,j;
k=-1,j=0;
next[j]=k;
while(j<lenv)
{
if(k==-1||an[j]==an[k])
{
k++;
j++;
next[j]=k;
}
else k=next[k];
}
return next[lenv];
}