原题链接:Here!
分析:使用归并排序查找逆序数然后设置一个游标从0开始扫,扫到输出就ok
/*
Note:
处理逆序数对问题
使用归并排序的思想
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//#define test
int cnt ;
const int inf=0x3f3f3f;
char str[100+5][50+5]; // n<=50 m<=100
void marge_sort(int *A,int x,int y,int *T){ // O(nlogn) 数据上限在4.5*10^6左右
if(y-x>1){
int m=x+(y-x)/2;
int p=x,q=m,i=x;
marge_sort(A,x,m,T); marge_sort(A,m,y,T);
while( p<m || q<y){
if( q>=y || ( p<m && A[p]<=A[q] )) T[i++]=A[p++];
else T[i++]=A[q++],cnt+=m-p;
}
for(int i=x;i<y;i++) A[i]=T[i];
}
}
int main(){
int T,n,m;
int A[100],t[100],Mark[100];
#ifdef test
freopen("Hdu 1379 DNA Sorting.txt","r",stdin);
#endif
scanf("%d",&T);
while(T--){
memset(Mark,0,sizeof(Mark));
memset(A,0,sizeof(A));
memset(t,0,sizeof(t));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
cnt=0;
scanf("%s",&str[i]);
for(int j=0;j<n;j++){ // 将字符型转化为整型
if(str[i][j]=='A') A[j]=1;
else if(str[i][j]=='C') A[j]=2;
else if(str[i][j]=='G') A[j]=3;
else if(str[i][j]=='T') A[j]=4;
}
marge_sort(A,0,n,t); // O(nlogn)
Mark[i]=cnt;
}
for(int i=0;i<inf;i++){ // 输出注意一下就ok,设定个标尺从下向上扫,虽然是m*inf.. 好在数据小
for(int j=0;j<m;j++){
if(Mark[j]==i)
printf("%s\n",str[j]);
}
}
}
return 0;
}