Description
Input
Output
Sample Input
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
Sample Output
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
求出每个串的逆序对的个数,然后按逆序对个数对DNA串进行排序。
求逆序对的方法是用归并排序#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct ty { long x; string s; inline bool operator < (const ty& b) const { if (x < b.x) return true; else return false; } }; long n, m; string t; ty a[200]; long sum; void merge1(long l, long mid, long r) { char tmp1[200] = {"\0"}, tmp2[200] = {"\0"}; for (long i = l; i <= mid; i++) { tmp1[i] = t[i]; } for (long i = mid + 1; i <= r; i++) { tmp2[i] = t[i]; } tmp1[mid + 1] = 'Z'; tmp2[r + 1] = 'Z'; long i = l , j = mid + 1; for (long k = l; k <= r; k++) { if (tmp1[i] <= tmp2[j]) { t[k] = tmp1[i]; i++; } else{ t[k] = tmp2[j]; sum +=mid - i + 1; j++; } } } void merge_sort(long l, long r) { if (l <r) { long mid = (l + r) / 2; merge_sort(l, mid); merge_sort(mid + 1, r); merge1(l, mid, r); } } long nixudui(long i) { sum = 0; t = a[i].s; merge_sort(0, m - 1); return sum; } int main() { freopen("G.in","r",stdin); while (scanf("%d%d\n", &m, &n) != EOF) { for (long i = 1; i<= n; i++) { cin >> a[i].s; a[i].x = nixudui(i); } sort(a + 1, a + 1 + n); for (long i = 1; i<= n; i++) { cout << a[i].s<<endl; } } return 0; }