题意:给你两个字符串,输出他们合并之后的最小长度的字符串
思路:1.长度小的优先 2.
#include<stdio.h>
#include<string.h>
#define max 100010
int next[max];
char st1[max],st2[max];
void getNext(char *pat)
{
int j=0,k=-1;
int len=strlen(pat);
next[0]=-1;
while(j<len)
{
if(k==-1||pat[j]==pat[k])
next[++j]=++k;
else
k=next[k];
}
}
int KMP(char *mat,char *pat)
{
int i=0,j=0;
int len1=strlen(mat),len2=strlen(pat);
getNext(pat);
while(i<len1&&j<len2)
{
if(j==-1||mat[i]==pat[j])
{
i++;j++;
}
else
j=next[j];
}
if(i==len1)
return j;
return 0;
}
int main()
{
int st1Len,st2Len;
while(scanf("%s%s",st1,st2)!=EOF)
{
st1Len=KMP(st2,st1);
st2Len=KMP(st1,st2);
//printf("%d %d\n",st1Len,st2Len);
if(st1Len>st2Len)
printf("%s%s\n",st2,st1+st1Len);
else if(st1Len<st2Len)
printf("%s%s\n",st1,st2+st2Len);
else
{
if(strcmp(st1,st2)<0)
printf("%s%s\n",st1,st2+st1Len);
else
printf("%s%s\n",st2,st1+st1Len);
}
}
return 0;
}
字典序小的优先