題意:給1<=n<=5*10^4個長度1<=|ai|<=50的字符串,將他們拼接成一個,輸出字典序最小的
1)話說此題費了一番周折,也做出來了,然後發現自己的代碼比宦豪和帆神的都長好多,發現自己應該好好學學String類了,確實比char數組好用好多~~
2)此題用char數組做的時候,要對char二維數組進行快排sort,百度了一下,應該是隻能用結構體
typedef struct node{
char str[55];
}node;
node ma[N];
然後對此結構體進行排序,但要是用string類的話就不用這樣了,直接開一個string 的一維數組就可以了string str[MAXN];
3)sort排序是cmp函數是bool型,而不是int型,這個也竟然卡了一下
順便記錄一下sort的cmp函數
#include<algorithm> using namespace std;
sort(a,a+n,cmp);對a[0]到a[n-1]排序,cmp不寫默認升序,從小到大
經典的greater<type>()和less<type>():
int a[10]={1,4,3,2,5,9,56,7,9,4};
int main()
{
int i,j;
sort(a,a+10,less<int>());//從小到大,升序
sort(a,a+10,greater<int>());//從大到小,降序
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
return 0;
}
int型,char型,double型都可以,結構體類似:
int maint[1000];
bool cmpint(int a,int b){
return a<b;//升序排列,從小到大
}
二維數組a[1000][2]按照a[][0]升序排列
可悲的是sort不支持二維數組,開結構體吧
本題我的代碼:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#define mem(a) memset(a,0,sizeof(a))
typedef long long ll;
#define N 50050
using namespace std;
typedef struct node{
char str[55];
}node;
node ma[N];
int n;
bool comp(node a,node b){
if(a.str[0]!=b.str[0]){
return a.str[0]<b.str[0];
}
else {
int la=strlen(a.str),lb=strlen(b.str);
int i,j,l;
l=min(la,lb);
for(i=0;i<l;i++){
if(a.str[i]!=b.str[i])
return a.str[i]<b.str[i];
}
char a1[110],b1[110];
for(i=0;i<la;i++)
a1[i]=a.str[i];
for(i=la;i<la+lb;i++)
a1[i]=b.str[i-la];
a1[la+lb]='\0';
for(i=0;i<lb;i++)
b1[i]=b.str[i];
for(i=lb;i<la+lb;i++)
b1[i]=a.str[i-lb];
b1[la+lb]='\0';
int tmp=strcmp(a1,b1);
if(tmp==0)return 0;
else if(tmp>0)return 0;
else return 1;
}
}
int main()
{
int i,j;
while(scanf("%d",&n)){
for(i=0;i<n;i++)
scanf("%s",ma[i].str);
sort(ma,ma+n,comp);
for(i=0;i<n;i++){
int tmp=strlen(ma[i].str);
for(j=0;j<tmp;j++){
printf("%c",ma[i].str[j]);
}
}
putchar('\n');
}
return 0;
}
看一下q神簡潔的代碼:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=50005;
string str[MAXN];
bool cmp(string a,string b)
{
return a+b<b+a;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>str[i];
sort(str,str+n,cmp);
for(int i=0;i<n;i++)
cout<<str[i];
return 0;
}