Pagini recente » Cod sursa (job #2203082) | Cod sursa (job #537396) | Cod sursa (job #2335615) | Cod sursa (job #1289160) | Cod sursa (job #2469491)
#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];
}
}