Description
One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
Input
The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.
Output
Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.
Sample Input
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
Sample Output
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
这个题目是一个比较简单的求逆序对和排序的题,只要先求出每一个字符串的逆序对的个数,再从小到大排序就行了,下面是代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct DNA{
char a[55];
int s,x;
bool operator <(DNA p)const {
return s==p.s?x<p.x:s<p.s;
}
}d[105];
void msort(char *a,int l,int r,int &s){
if(l==r){
return;
}
int m=(l+r)>>1,i,j,k=l;
char tp[55];
msort(a,l,m,s);
msort(a,m+1,r,s);
for(i=l,j=m+1;i<=m&&j<=r;){
if(a[i]>a[j]){
tp[k++]=a[j++];
s+=m-i+1;
}
else{
tp[k++]=a[i++];
}
}
while(i<=m){
tp[k++]=a[i++];
}
while(j<=r){
tp[k++]=a[j++];
}
for(i=l;i<=r;i++){
a[i]=tp[i];
}
}
int main(){
int n,l,i;
scanf("%d%d",&l,&n);
for(i=1;i<=n;i++){
scanf("%s",d[i].a);
d[i].s=0;
d[i].x=i;
DNA tp=d[i];
msort(tp.a,0,l-1,d[i].s);
}
sort(d+1,d+n+1);
for(i=1;i<=n;i++){
puts(d[i].a);
}
return 0;
}