Cod sursa(job #2958857)

Utilizator mihairazvan03Dana Mihai mihairazvan03 Data 28 decembrie 2022 17:39:45
Problema ADN Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#include <string.h>

using namespace std;
ifstream in("adn.in");
ofstream out("adn.out");

vector<vector<int>> dp;
string sir1, sir2;

string f(string str1, string str2)
{
    int n, m, i, j, sus, st;
    string rez = "";

    n = str1.size();
    m = str2.size();
    dp.clear();
    dp.resize(n + 1);

    for(i = 0; i <= n; i++)
        dp[i].resize(m + 1, 0);

    for(i = 0; i < n; i++)      //creem matricea dp la fel cum am facut si la longest common
        for(j = 0; j < m; j++)
            if(str1[i] == str2[j])
            {
                if(i > 0 && j > 0)
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                else
                    dp[i][j] = 1;
            }
            else
            {
                if(i - 1 >= 0)
                    sus = dp[i - 1][j];
                else
                    sus = 0;

                if(j - 1 >= 0)
                    st = dp[i][j - 1];
                else
                    st = 0;

                dp[i][j] = max(sus, st);
            }

    i = n - 1;
    j = m - 1;

    while(i >= 0 && j >= 0)  //facem ca la interclasare pt a cosntrui stringul rezultat
    {
        if(str1[i] == str2[j])   //daca sunt egale ataugam litera respectiva in rezultat
        {
            rez += str1[i];
            i--;
            j--;
        }
        else if((i > 0 && j > 0 && dp[i - 1][j] >= dp[i][j - 1]) || (j == 0 && i > 0)) //luam str1[i] daca exista mai multi common ancestori pana acum ai lui str1 decat str2 sau suntem la ultimul caracter din str2, dar nu si la ultimul din str1
        {
            rez += str1[i];
            i--;
        }
        else
        {
            rez += str2[j];
            j--;
        }
    }

    while(i >= 0)      //acum adaugam ce a mai ramas
    {
        rez += str1[i];
        i--;
    }

    while(j >= 0)
    {
        rez += str2[j];
        j--;
    }

    for(i = 0, j = rez.size() - 1; i <= j; i++, j--)   //sirul rezultat e construita pornind de la sfarsit la inceput, asa ca trebuie inversat
        swap(rez[i], rez[j]);

    return rez;
}

int main()
{
    int nrSiruri, i;

    in >> nrSiruri;
    in.get();

    in >> sir1 >> sir2;
    sir1 = f(sir1, sir2);

    while(in >> sir2)
        sir1 = f(sir1, sir2);


    out << sir1;
}