因为要将两个字符串合并,也就是找到A的后缀和B的前缀相同的最大长度,那么我们可以将他们连接,中间放一个不会出现的字符,求取next数组即可
然后依照题目要求输出即可
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 100007
using namespace std;
char s1[MAX<<1],s2[MAX];
char ans1[MAX<<1],ans2[MAX<<1];
void get_next ( char p[] , int next [] )
{
int i = 0 , k = -1 , len = strlen ( p );
next[0] = -1;
while ( i <= len )
if ( k == -1 || p[i] == p[k] )
i++,k++,next[i] = k;
else k = next[k];
}
void solve ( int len1 , int len2 )
{
int next[MAX<<1];
get_next ( s1 , next );
int len = next[len1+len2+1];
int cnt = 0;
for ( int i = len1+1 ; i <= len1+len2; i++ )
ans1[cnt++] = s1[i];
for ( int i = len; i < len1 ; i++ )
ans1[cnt++] = s1[i];
ans1[cnt] = 0;
get_next ( s2 , next );
len = next[len1+len2+1];
cnt = 0;
for ( int i = len2+1; i <= len1+len2; i++ )
ans2[cnt++] = s2[i];
for ( int i = len ; i < len2 ; i++ )
ans2[cnt++] = s2[i];
ans2[cnt] = 0;
if ( strlen ( ans1 ) == strlen ( ans2 ) )
{
if ( strcmp ( ans1 , ans2 ) <= 0 )
printf ( "%s" , ans1 );
else printf ( "%s" , ans2 );
}
else
printf ( "%s" , strlen( ans1 ) > strlen ( ans2 ) ? ans2 : ans1 );
puts ("");
}
int main ( )
{
while ( ~scanf ( "%s" , s2 ) )
{
scanf ( "%s" , s1 );
int len1 = strlen ( s1 ) , len2 = strlen ( s2 );
for ( int i = 0 ; i < len2 ; i++ )
s1[len1+i+1] = s2[i];
for ( int i = 0 ; i < len1 ; i++ )
s2[len2+i+1] = s1[i];
s1[len1] = s2[len2] = '#';
s1[len1+len2+1] = s2[len1+len2+1] = 0;
solve ( len1 , len2 );
}
}