这题就是求逆序对然后根据逆序对大小排序
暴力可解!
我选择的是树状数组,这题如果变种,数据过大,或者需要离散化,暴力就不好解决了
这题浪费挺长时间的,主要是t数组忘记清0.。导致后面的数据全部错误
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
typedef struct node{
string s;
int len;
}node;
int t[1000]={0};
int add(int i,int v){
while(i<=30) {
t[i]+=v;
i+=i&-i;
}
}
int getsum(int i){
int sum=0;
while(i){
sum+=t[i];
i-=i&-i;
}
return sum;
}
bool cmp(node n1,node n2){
return n1.len<n2.len;
}
int main(){
int num;
cin>>num;
getchar();
while(num--){
int n,m;
cin>>n>>m;
node no[100+10];
getchar();
for(int i=0;i<m;i++){
int sum=0;
//cin>>no[i].s;
for(int i=0;i<30;i++) t[i]=0;
int len=no[i].s.size();
string str="";
for(int j=0;j<n;j++){
char c;
cin>>c;
str+=c;
add(c-'A'+1,1);
sum+=j+1-getsum(c-'A'+1);
//cout<<sum<<endl;
}
no[i].len=sum;
no[i].s=str;
}
sort(no,no+m,cmp);
for(int i=0;i<m;i++){
cout<<no[i].s<<endl;
}
}
return 0;
}