Pagini recente » Cod sursa (job #3250733) | Cod sursa (job #162301) | Cod sursa (job #2067141) | Cod sursa (job #1963641) | Cod sursa (job #2958857)
#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;
}