DNA Sorting

引用


Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 44479 Accepted: 17334

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
 
 
分析:
1. 输入m,n. 按m,n限定后续的string的长度及个数.
2. 我这里这组string用结构体链表连接.string使用char*然后动态分配内存空间malloc()
3. 先计算string需要排序的次数(unsortedness到sortedness)存到qty,然后按qty排序链表
我的代码:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
struct DNA
{
 char* sequence;
 int sortqty;
 struct DNA* next;
};
int main()
{
 int n;
 int m;
 char In;
 int cpy_m;
 struct DNA unsortedness;
 struct DNA* tail;
 tail=&unsortedness;
 tail->next=NULL;
 cout<<"length of the strings n(0<n<=50) and number of strings m(0<m<=100):"<<endl;
 while(1)
 {
  cin>>n>>m;
  if(n>0 && n<=50 && m>0 && m<=100)
  {
   break;
  }
  cout<<"wrong!/n/"n/" (0 < n <= 50) /"m/" (0 < m <= 100):"<<endl;
  cin.clear();
 }
 system("CLS");
 cout<<"length of the strings n(0<n<=50) and number of strings m(0<m<=100):/n"
  <<n<<" "<<m<<endl;
 cpy_m=m;
 while(m)
 {
  tail->next=new DNA;
  tail=tail->next;
  tail->next=NULL;
  
  tail->sequence=(char*)malloc(n+1);
  for(int i=0;i<n;)
  {
   cin>>In;
   if(In=='A'|| In=='C' || In=='T' || In=='G')
   {
    *(tail->sequence+i)=In;
    i++;
   }
   else
    cout<<"Input wrong!"<<endl;  
  }
  *(tail->sequence+n+1)='/0';
  m--;
 }
 tail=unsortedness.next;
 //sorting DNA sequence
 while(tail)
 {
  tail->sortqty=0;
  for(int i=0;i<n-1;i++)
  { 
   for(int j=i+1;j<n;j++)
   {
    if(*(tail->sequence+i)>*(tail->sequence+j))
     tail->sortqty++;
   }
  }
  tail=tail->next;
 }
 
 cout<<"/n"<<endl;
 
 tail=unsortedness.next;
 //排序
 struct DNA* nt;
 
 for(int i=0;i<cpy_m-1;i++)
 {
  tail=unsortedness.next;
  while(tail->next)
  {
   nt=tail->next;
   if(tail->sortqty>nt->sortqty)
   {
    int tqty;
    char* tsq;
    tqty=tail->sortqty;
    tsq=tail->sequence;
    tail->sortqty=nt->sortqty;
    tail->sequence=nt->sequence;
    nt->sortqty=tqty;
    nt->sequence=tsq;
   }
   tail=tail->next;
  }
 }
 //输出
 tail=unsortedness.next;
 while(tail)
 {
  cout<<tail->sequence<<endl;
  tail=tail->next;
 }
 
 _getch();
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值