链接:点击打开链接
题意:给出两个串,要求将相同的前缀后缀合并,保证合并后的串长度最短的前提下字典序最小
代码:
#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int siz=100005;
int nex[siz<<1];
char S[siz],T[siz],ST[siz<<1];
void getnex(int len){
int i,j;
j=-1,i=0;
nex[0]=-1;
while(i<len){
if(j==-1||ST[j]==ST[i])
nex[++i]=++j;
else
j=nex[j];
}
}
int main(){ //就是next数组的应用,将B拼在A后面,或则A在B后面
string a,b; //先满足长度最短,再满足字典序最小
int i,ans,len,slen,tlen;
while(scanf("%s%s",S,T)!=EOF){
slen=strlen(S);
tlen=strlen(T);
len=0;
for(i=slen-1;i>=0;i--)
ST[len++]=S[i];
for(i=tlen-1;i>=0;i--)
ST[len++]=T[i];
getnex(len);
ans=min(slen,nex[len]);
a="";
for(i=0;i<slen;i++)
a+=S[i];
for(i=ans;i<tlen;i++)
a+=T[i];
len=0;
for(i=tlen-1;i>=0;i--)
ST[len++]=T[i];
for(i=slen-1;i>=0;i--)
ST[len++]=S[i];
getnex(len);
ans=min(tlen,nex[len]);
b="";
for(i=0;i<tlen;i++)
b+=T[i];
for(i=ans;i<slen;i++)
b+=S[i];
if(a.size()==b.size()){ //先判断长度
if(a<b)
cout<<a<<endl;
else
cout<<b<<endl;
}
else if(a.size()<b.size())
cout<<a<<endl;
else
cout<<b<<endl;
}
return 0;
}