暴力也可以
#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<cstdio>
using namespace std;
typedef struct node{
char a[55];
int index;
int len;
}node;
int tree[50]={0};
int getsum(int n){
int sum=0;
while(n){
sum+=tree[n];
n-=n&(-n);
}
return sum;
}
int updata(int x,int v){
while(x<=30){
tree[x]+=v;
x+=x&-x;
}
}
bool cmp(node n1,node n2){
if(n1.len==n2.len) return n1.index<n2.index;
return n1.len<n2.len;
}
int main(){
int n,m;
cin>>n>>m;
node no[101];
for(int i=0;i<m;i++){
scanf("%s",no[i].a);
for(int j=0;j<=30;j++) tree[j]=0;
int sum=0;
for(int j=0;j<n;j++){
updata(no[i].a[j]-'A'+1,1);
sum+=j+1-getsum(no[i].a[j]-'A'+1);
}
no[i].index=i;
no[i].len=sum;
}
sort(no,no+m,cmp);
for(int i=0;i<m;i++){
cout<<no[i].a<<endl;
}
return 0;
}