Pagini recente » Cod sursa (job #2543583) | Cod sursa (job #911039) | Cod sursa (job #649526) | Cod sursa (job #178759) | Cod sursa (job #2609847)
#include <bits/stdc++.h>
#define MAXN 1 << 18
#define oo 0x3f3f3f3f
using namespace std;
ifstream f("adn.in");
ofstream g("adn.out");
struct prv
{
int mask, text;
};
prv P[MAXN + 5][18];
int n, minim = oo, poz;
string text[18];
short pi[30005];
short C[MAXN + 5][18], Cost[18][18];
void Read()
{
f>>n;
for(int i = 0;i < n;++i)
f>>text[i];
memset(C, oo, sizeof(C));
}
void compute(string cuv)
{
int q = 0;
pi[1] = 0;
for(int i = 2;i <= cuv.length();++i)
{
while(q && cuv[q] != cuv[i - 1])
q = pi[q];
if(cuv[q] == cuv[i - 1])
++q;
pi[i] = q;
}
}
int KMP(string cuv1, string cuv2)
{
int q = 0;
for(int i = 1;i <= cuv2.length();++i)
{
while(q && cuv1[q] != cuv2[i - 1])
q = pi[q];
if(cuv1[q] == cuv2[i - 1])
++q;
if(q == cuv1.length() - 1)
return 0;
}
return cuv1.length() - q;
}
void reconstruct(int mask, int varf)
{
if(P[mask][varf].text == -1)
{
for(int i = 0;i < n;++i)
if(mask & (1 << i))
{
g<<text[varf];
return;
}
}
reconstruct(P[mask][varf].mask, P[mask][varf].text);
if(Cost[P[mask][varf].text][varf])
{
string result = text[varf].substr(text[varf].length() - Cost[P[mask][varf].text][varf]);
g<<result;
}
}
void lant()
{
for(int mask = 1;mask < (1 << n);++mask)
for(int pos = 0;pos < n;++pos)
if(mask & (1 << pos))
{
int mask2 = mask ^ (1 << pos);
if(mask2 == 0)
{
P[mask][pos] = {0, -1};
C[mask][pos] = text[pos].length();
break;
}
for(int j = 0;j < n;++j)
if(mask2 & (1 << j))
{
if(C[mask2][j] + Cost[j][pos] < C[mask][pos])
{
C[mask][pos] = C[mask2][j] + Cost[j][pos];
P[mask][pos] = {mask2, j};
}
}
}
for(int i = 0;i < n;++i)
if(C[(1 << n) - 1][i] < minim)
minim = C[(1 << n) - 1][i], poz = i;
reconstruct((1 << n) - 1, poz);
}
void Solve()
{
for(int i = 0;i < n;++i)
for(int j = 0;j < n;++j)
if(i != j)
Cost[j][i] = KMP(text[i], text[j]);
lant();
}
int main()
{
Read();
Solve();
return 0;
}