分治逆序对+排序,求hack
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int lin[101],b[52],ans;
struct ss{
string a;
int ans,x;
} a[101];
void merge(int l,int r,int mid)
{
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r)
{
if(lin[i]<=lin[j])//等号要加 关乎稳定
{
b[k++]=lin[i++];
}
else
{
b[k++]=lin[j++];
ans+=mid-i+1;
}
}
while(i<=mid) b[k++]=lin[i++];//左边有可能还有数
while(j<=r) b[k++]=lin[j++]; //右边有可能还有数
for(int i=l;i<=r;i++)
{
lin[i]=b[i];
}
}
void mergesort(int l,int r)
{
if(l==r)
{
return;
}
//分成左右两部分解决
int mid=(l+r)/2;
mergesort(l,mid);//解决左边部分
mergesort(mid+1,r);//解决右边部分
merge(l,r,mid);
}
bool cmp(ss c,ss d){
return c.ans<d.ans;
}
int main()
{
int T;
cin>>T;
while(T--){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].a;
for(int j=0;j<n;j++){
lin[j+1]=a[i].a[j];
}
ans=0;
mergesort(1,n);
a[i].ans=ans;
a[i].x=i;
}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++){
cout<<a[i].a<<endl;
}
if(T) cout<<endl;
}
return 0;
}