死亡回放: https://www.luogu.com.cn/record/list?pid=P1012&user=1075989
代码:
//洛谷p1012.cpp
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int n;
void merge(vector<string> &nums,int start,int end,int w,vector<string> &tmp){
if(start-end>1){
merge(nums,start,end/2,w,tmp);
merge(nums,end/2,end,w,tmp);
int x=start,y=end/2;
for(int i=start;i<end;i++){
if(y>=end||(x<end/2&&(nums[x].size()<w||nums[x][w]>nums[y][w]))){
tmp[i]=nums[x];
x++;
}else{
tmp[i]=nums[y];
y++;
}
}
for(int i=start;i<end;i++)nums[i]=tmp[i];
}else{
if(nums[start].size()>w&&nums[start][w]<nums[end][w])swap(nums[start],nums[end]);
}
}
void stringMergeSort(vector<string> &nums,vector<string> &tmp,int maxsize){
for(int i=0;i<maxsize;i++){
merge(nums,0,n/2,i,tmp);
merge(nums,n/2,n,i,tmp);
}
}
int main(){
int maxsize=0,s;
cin>>n;vector<string> nums(n+1,"");
vector<string> tmp(n,"");
for(int i=0;i<n;i++){
cin>>nums[i];
s=nums[i].size();
maxsize=max(maxsize,s);
}
stringMergeSort(nums,tmp,maxsize);
for(int i=n;i>=0;cout<<nums[i--]);
return 0;
}