Pagini recente » Cod sursa (job #1944871) | Cod sursa (job #1388367) | Cod sursa (job #2060145) | Cod sursa (job #523936) | Cod sursa (job #1097134)
#include <cstdio>
#include <cstring>
#include <cstdlib>
const unsigned short maxN = 18;
const unsigned int maxDNASequenceLength = 30000;
const char *in = "adn.in", *out = "adn.out";
long graph[maxN][maxN];
unsigned int N;
char DNA[maxN][maxDNASequenceLength*maxN];
long *kmpTable = new long[maxN*maxDNASequenceLength];
unsigned int mask;
void createKMPTable(char *pattern) {
long k = -1, patternLength = strlen(pattern);
memset(kmpTable, 0, maxN*maxDNASequenceLength);
kmpTable[0] = k;
for ( long i = 1; i < patternLength; i++) {
while (k > -1 && pattern[k+1] != pattern[i])
k = kmpTable[k];
if (pattern[i] == pattern[k+1])
k++;
kmpTable[i] = k;
}
}
bool eliminated(unsigned int n) {
return mask & (1 << n);
}
void eliminate(unsigned int n) {
mask |= (1 << n);
}
long kmpSearch(char *target, char *pattern) {
createKMPTable(pattern);
long k = -1, targetLength = strlen(target), patternLength = strlen(pattern);
for (long i = 0; i < targetLength; i++) {
while (k > -1 && pattern[k+1] != target[i]) {
k = kmpTable[k];
}
if (target[i] == pattern[k+1]) {
k++;
}
if (k == patternLength - 1) {
return -1;
}
}
return k+1;
}
void read() {
FILE *f = fopen(in, "r");
fscanf(f, "%u", &N);
for(unsigned int i = 0; i < N; i++) {
fscanf(f, "%s", DNA[i]);
}
}
void write(char c[]) {
FILE *f = fopen(out, "w");
fprintf(f, "%s", c);
}
void createGraph() {
for(unsigned int i = 0; i < N; i++) {
graph[i][i] = -1;
}
for(unsigned int i = 0; i < N; i++) {
for(unsigned int j = 0; j < N; j++) {
if(i != j && !eliminated(i) && !eliminated(j)) {
graph[i][j] = kmpSearch(DNA[i], DNA[j]);
if(graph[i][j] == -1) {
eliminate(j);
}
}
}
}
}
void copyGraphLine(unsigned int lineA, unsigned int lineB) {
for(unsigned int i = 0; i < N; i++) {
graph[lineB][i] = graph[lineA][i];
}
}
bool finished() {
int x = 0;
for(unsigned int i = 0; i < N; i++) {
if(!eliminated(i)) {
x++;
}
}
return x == 1;
}
void init(unsigned int &x, unsigned int &y) {
x = 0; y = 0;
while(eliminated(x)) {
x++;
}
while(eliminated(y)) {
y++;
}
}
void mergeDNASequences() {
unsigned int maxX, maxY;
while(!finished()) {
init(maxX, maxY);
for(unsigned int j = 0; j < N; j++) {
if(!(eliminated(j))) {
for(unsigned int k = 0; k < N; k++) {
if(!(eliminated(k)) && graph[j][k] > graph[maxX][maxY]) {
maxX = j;
maxY = k;
}
}
}
}
strcat(DNA[maxX], DNA[maxY] + graph[maxX][maxY]);
copyGraphLine(maxY, maxX);
eliminate(maxY);
}
write(DNA[maxX]);
}
int main() {
read();
createGraph();
mergeDNASequences();
return 0;
}