/*求出各DNA序列的逆序对,按从小到大稳定排序*/
/*void Merge(char *a,int l,int m,int r) //归并求逆序对
{
int i = l;
int j = m + 1;
int k = l;
char tmp[60];
while(i <= m && j <= r)
{
if(a[i] > a[j])
{
tmp[k++] = a[j++];
ans += m - i + 1;
}
else
{
tmp[k++] = a[i++];
}
}
while(i <= m) tmp[k++] = a[i++];
while(j <= r) tmp[k++] = a[j++];
for(int i=l;i<=r;i++)
a[i] = tmp[i];
}
void Merge_sort(char *a,int l,int r)
{
if(l < r)
{
int m = (l + r) >> 1;
Merge_sort(a,l,m);
Merge_sort(a,m+1,r);
Merge(a,l,m,r);
}
}
*/
#include <iostream>
#include <stdio.h>#include <string.h>
#include <algorithm>
using namespace std;
struct DNA
{
char a[60];
int b;
}d[150];
int ans;
void Merge(char *a,int l,int m,int r) //归并求逆序对
{
int i = l;
int j = m + 1;
int k = l;
char tmp[60];
while(i <= m && j <= r)
{
if(a[i] > a[j])
{
tmp[k++] = a[j++];
ans += m - i + 1;
}
else
{
tmp[k++] = a[i++];
}
}
while(i <= m) tmp[k++] = a[i++];
while(j <= r) tmp[k++] = a[j++];
for(int i=l;i<=r;i++)
a[i] = tmp[i];
}
void Merge_sort(char *a,int l,int r)
{
if(l < r)
{
int m = (l + r) >> 1;
Merge_sort(a,l,m);
Merge_sort(a,m+1,r);
Merge(a,l,m,r);
}
}
int cmp(DNA a1,DNA b1) //从小到大,稳定
{
return a1.b<b1.b;
}
int main()
{
int n,m;
freopen("in.txt","r",stdin);
cin>>n>>m;
for (int i=1;i<=m;i++)
{
//gets(d[i].a); 用gets会多读一个回车符,字符数组可直接用cin
cin>>d[i].a;
char t[60];
strcpy(t,d[i].a); //字符数组赋值
ans=0;
Merge_sort(t,0,n-1);
d[i].b=ans;
// puts(d[i].a);cout<<endl;
}
// for (int i=1;i<=m;i++) cout<<d[i].b<<endl;
//cout << "Hello world!" << endl;
sort(d+1,d+m+1,cmp); //注意d+m+1,要+1
for (int i=1;i<=m;i++)
{
puts(d[i].a); //puts会自动输出回车
}
return 0;
}