【poj1007】DNA Sorting

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.

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值