Cod sursa(job #2469491)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 7 octombrie 2019 16:09:44
Problema ADN Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("adn.in");
ofstream out("adn.out");
const int N = 18;
const int L = 30005;
char v[N][L];
int cost[N][N],pi[N][L],ord[N];
int dp[1<<N][N],best[1<<N][N],n;
int solve(int x, int y)
{
    int m = strlen(v[x]+1), p = strlen(v[y]+1), q = 0;
    bool found = 0;
    for (int i = 1; i<=m; i++)
    {
        while (v[y][q+1]!=v[x][i] && q>0)
            q = pi[y][q];
        if (v[x][i] == v[y][q+1])
            q++;
        if (q == p)
        {
            found = 1;
            break;
        }
    }
    if (found)
        return 0;
    else
        return p-q;
}
int main()
{
    in >> n;
    for (int i = 0; i<n; i++)
        in >> (v[i]+1);
    for (int i = 0; i<n; i++)
    {
        int m = strlen(v[i]+1), q = 0;
        for (int j = 2; j<=m; j++)
        {
            while (v[i][q+1]!=v[i][j] && q>0)
                q = pi[i][q];
            if (v[i][j] == v[i][q+1])
                q++;
            pi[i][j] = q;
        }
    }
    for (int i = 0; i<n; i++)
        for (int j = 0; j<n; j++)
        {
            if (i!=j)
                cost[i][j] = solve(i,j);
        }

    for (int i = 0; i<(1<<n); i++)
        for (int j = 0; j<n; j++)
            dp[i][j] = INT_MAX;
    for (int i = 0; i<n; i++)
        dp[1<<i][i] = strlen(v[i]+1);
    for (int i = 1; i<(1<<n); i++)
        for (int j = 0; j<n; j++)
            if ((1<<j)&i)
                for (int z = 0; z<n; z++)
                    if (!((1<<z)&i) && dp[i^(1<<z)][z]>dp[i][j]+cost[j][z])
                    {
                        dp[i^(1<<z)][z] = dp[i][j]+cost[j][z];
                        best[i^(1<<z)][z] = j;
                    }
    int Min = INT_MAX, poz;
    for (int i = 0; i<n; i++)
        if (dp[(1<<n)-1][i]<Min)
        {
            Min = dp[(1<<n)-1][i];
            poz = i;
        }
    int k = n,val = ((1<<n)-1);
    ord[k--] = poz;
    for (int i = 2; i<=n; i++)
    {
        int aux = poz;
        poz = best[val][poz];
        val^=(1<<aux);
        ord[k--] = poz;
    }
    out << v[ord[1]]+1;
    for (int i = 2; i<=n; i++)
    {
        int m = strlen(v[ord[i]]+1);
        for (int j = m-cost[ord[i-1]][ord[i]]+1; j<=m; j++)
            out << v[ord[i]][j];
    }
}