Pagini recente » Cod sursa (job #2809010) | Cod sursa (job #391859) | Cod sursa (job #1600603) | Cod sursa (job #342908) | Cod sursa (job #1612669)
#include <bits/stdc++.h>
#define nmax 18
#define lmax 30005
#define inf 1<<29
using namespace std;
char s[nmax][lmax],o[lmax];
char af[nmax*lmax];
int n,v[1<<(nmax)][nmax];
short q[1<<nmax][nmax];
int cost[nmax][nmax],com[nmax][nmax],t[nmax];
int pi[nmax],a[nmax];
int sol,soli,solj,soll;
int main()
{
int i,j,l,k,p;
freopen("adn.in","r",stdin);
freopen("adn.out","w",stdout);
scanf("%d",&n);
for (i=0;i<n;i++) {
memset(o,0,sizeof(o));
scanf("%s",&o);
memcpy(s[i]+1,o,lmax);
while (s[i][t[i]+1])
t[i]++;
}
for (i=0;i<n;i++) {
pi[1]=0;
a[i]=1;
for (k=2,l=0;s[i][k];k++) {
while (l&&s[i][k]!=s[i][l+1])
l=pi[l];
if (s[i][k]==s[i][l+1])
l++;
pi[k]=l;
}
for (j=0;j<n&&a[i];j++)
if (i!=j) {
for (k=2,l=0;s[j][k]&&a[i];k++) {
while (l&&s[j][k]!=s[i][l+1])
l=pi[l];
if (s[j][k]==s[i][l+1])
l++;
if (l==t[i]) {
a[i]=0;
}
}
com[j][i]=l;
cost[j][i]=t[i]-com[j][i];
}
}
for (i=0;i<n;i++)
if (a[i]) {
v[1<<i][i]=t[i];
soli+=1<<i;
}
for (i=0;i<(1<<n);i++)
for (j=0;j<n;j++)
if (!v[i][j])
v[i][j]=inf;
for (i=0;!a[i];i++);
for (i=1<<i;i<soli;i++) {
for (j=0;j<n;j++)
if (a[j])
if ((i&(1<<j))==0) {
p=i+(1<<j);
for (k=0;k<n;k++)
if (a[k]&&v[i][k]!=inf)
if (i&(1<<k))
if (v[i][k]+cost[k][j]<v[p][j]) {
v[p][j]=v[i][k]+cost[k][j];
q[p][j]=k;
}
}
}
sol=inf;
for (i=0;i<n;i++)
if (v[soli][i]<sol) {
sol=v[soli][i];
solj=i;
}
int m=n;
while (sol) {
if (m==n) {
k=t[solj];
memcpy(af+(sol-k+1),s[solj]+1,k);
sol-=k;
k=q[soli][solj];
soli-=1<<solj;
soll=solj;solj=k;
m--;
}
else {
k=t[solj]-com[solj][soll];
memcpy(af+(sol-k+1),s[solj]+1,k);
sol-=k;
k=q[soli][solj];
soli-=1<<solj;
soll=solj;solj=k;
m--;
}
}
printf("%s",af+1);
return 0;
}