poj 1007 dna逆序數

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

    大概意思就是求逆序數,然後按照逆序數從小到大排序。算是複習一下sort用法。

    這裏因爲只有四個字母,所以求逆序數可以直接從後往前遍歷,遍歷過程中記錄這四個字母的個數,遍歷到某一個位置時,當前的逆序數就是比它小的字母的個數的總和。

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct strr
{
	char a[55];
	int s;
};
strr str[105];
int cmp(strr sa, strr sb)
{
	return sa.s <= sb.s;
}
int reversion(char a[], int l)
{
	int i, na = 0, nc = 0, nt = 0, ng = 0, sum = 0;
	for(i = l - 1 ; i >= 0 ; i--)
	{
		switch(a[i])
		{
			case 'A' : na++; break;
			case 'C' : nc++; sum += na; break;
			case 'G': ng++; sum += na; sum += nc; break;
			case 'T': nt++; sum += na ; sum += nc; sum += ng; break;
		}
	}
	//printf("%d\n", sum);
	return sum;
}
int main()
{
	int n, i, l;
	scanf("%d %d", &l, &n);
	for(i = 0 ; i < n ; i++)
	{
	    scanf("%s", str[i].a);
	    //str[i].s = reversion(str[i].a, l);
	}
	for(i = 0 ; i < n ; i++)
	{
	    str[i].s = reversion(str[i].a, l);
	}
	sort(str, str + n, cmp);
	for(i = 0 ; i < n ; i++)
	    printf("%s\n", str[i].a);
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章