| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
一个O(N)的算法, 不过老是WA, 大家帮忙看一下, 多谢#include <iostream>
using namespace std;
int main()
{
char *dna, *a, *d, **ind, c[5];
int n, m, i, j, k, v, t, s, p;
cin>>n>>m; // Read n&m;
t = m*(n+1);
p = n*(n-1)/2;
s = m*p;
dna = new char[t]; // All DNA data will be stored here
d = new char[s]; // DNA index in 'dna' (The max inversions of one DNA is n*(n-1), and there are m DNAs)
ind = new char *[p]; // Pointers to each inversion value space in d
memset(d, -1, s); // Init each d to -1
ind[0] = d;
for(i=1; i<p; i++)
{
ind[i] = ind[i-1] + m;
}// Now ind[0] pointed to inversion 0, ind[1] to 1, ...
a = dna;
for(i=0; i<m; i++)
{
cin>>dna+(n+1)*i;
a += n+1;
}// Read all DNAs
for(i=0; i<t; i++) // Replace ACGT with 1234, just for easy to compute.
{
switch(dna[i])
{
case 'A':
dna[i] = 1;
break;
case 'C':
dna[i] = 2;
break;
case 'G':
dna[i] = 3;
break;
case 'T':
dna[i] = 4;
break;
default:
break;
}
}
a = dna;
for(i=0; i<m; i++)
{
memset(c, 0, 5); // Init c
v = 0;
for(j=0; j<n; j++)
{
c[a[j]]++; // c[4] is the count of T, c[3] is G, 2 is C, 1 is A, 0 is not used
for(k=4; k>a[j]; k--)
{
v += c[k];
}// Now v is the inversion of this DNA
}
*(ind[v]) = i;
ind[v]++; // Add this DNA to the v inversion space, and new inversion index to this space move 1 char right
a += n+1;
}// Now values!=-1 in d is the ordered DNA indexes
for(i=0; i<t; i++) // Back to ACGT from 1234
{
switch(dna[i])
{
case 1:
dna[i] = 'A';
break;
case 2:
dna[i] = 'C';
break;
case 3:
dna[i] = 'G';
break;
case 4:
dna[i] = 'T';
break;
default:
break;
}
}
for(i=0; i<s; i++)
{
if(d[i] >= 0) // If the index is not -1
{
cout<<dna + d[i]*(n+1)<<endl; //The DNA
}
}
delete[] dna;
delete[] d;
delete[] ind;
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator