DNA Sorting
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 89359 | Accepted: 35910 |
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
一样求逆序对数,根据逆序对数的数量稳定的排序(非递减),再输出DNA序列。依然是用归并排序,求逆序对数。
import java.util.Arrays;
import java.util.Scanner;
/**
* Created by 小粤 on 2015/8/4.
*/
public class Main
{
private static DNA[] dnas;
private static char[] characters = new char[50];
private static char[] aux = new char[50];
public static void sort(int lo, int hi, int dnasIndex)
{
if (lo >= hi)
return;
int mid = (lo + hi) / 2;
sort(lo, mid, dnasIndex);
sort(mid + 1, hi, dnasIndex);
merge(lo, mid, hi, dnasIndex);
}
private static void merge(int lo, int mid, int hi, int dnasIndex)
{
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++)
{
aux[k] = characters[k];
}
for (int k = lo; k <= hi; k++)
{
if (i > mid)
{
characters[k] = aux[j++];
}
else if (j > hi)
{
characters[k] = aux[i++];
}
else if (aux[j] < aux[i])
{
characters[k] = aux[j++];
dnas[dnasIndex].counter += mid - i + 1;
}
else
{
characters[k] = aux[i++];
}
}
}
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int lengthOfStrings = scanner.nextInt();
int numberOfStrings = scanner.nextInt();
dnas = new DNA[numberOfStrings]; // Oh, shit! Because of Arrays.sort()..
for (int i = 0; i < numberOfStrings; i++)
{
dnas[i] = new DNA();
dnas[i].string = scanner.next();
for (int j = 0; j < lengthOfStrings; j++)
{
characters[j] = dnas[i].string.charAt(j);
}
sort(0, lengthOfStrings - 1, i);
}
Arrays.sort(dnas);
for (DNA dna : dnas)
{
System.out.println(dna);
}
}
}
class DNA implements Comparable<DNA>
{
public String string;
public int counter;
@Override
public int compareTo(DNA o)
{
return counter - o.counter;
}
@Override
public String toString()
{
return string;
}
}