Pagini recente » Cod sursa (job #2420159) | Cod sursa (job #567180) | Cod sursa (job #2790240) | Cod sursa (job #2183873) | Cod sursa (job #1130242)
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define zs(x) ((x)&(x-1))
using namespace std;
const int N=18, M=30010, INF=0x3f3f3f3f;
char a[N][M];
int pi[N][M], b[N][N], c[N][N], dp[1<<N][N], nxt[1<<N][N], v[1<<N][N], nr[N];
int sz[N];
int main()
{
freopen("adn.in", "r", stdin);
freopen("adn.out", "w", stdout);
int n, m, i, j, k, p, sol=INF, soli, x, ii;
scanf("%d\n", &n);
for(i=0;i<n;i++)
{
fgets(a[i]+1, M, stdin);
sz[i]=strlen(a[i]+1)-1;
a[i][sz[i]+1]='\0';
for(j=2, k=0;j<=sz[i];j++)
{
while(k&&a[i][j]!=a[i][k+1]) k=pi[i][k];
if(a[i][j]==a[i][k+1]) k++;
pi[i][j]=k;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j) continue;
for(p=1, k=0;p<=sz[i];p++)
{
while(k&&a[i][p]!=a[j][k+1]) k=pi[j][k];
if(a[i][p]==a[j][k+1]) k++;
if(k==sz[j]) b[i][j]=1;
}
c[i][j]=k;
}
}
memset(dp, INF, sizeof(dp));
for(m=1;m<(1<<n);m++)
{
for(i=0;i<n;i++)
{
if(!(m&(1<<i))) continue;
if(!zs(m))
dp[m][i]=sz[i], v[m][i]=i;
ii=v[m][i];
for(x=0;x<n;x++)
{
if(!(m&(1<<x)))
{
if(dp[m|(1<<x)][x]>dp[m][i]+sz[x]-c[ii][x])
{
dp[m|(1<<x)][x]=dp[m][i]+sz[x]-c[ii][x];
nxt[m|(1<<x)][x]=i;
v[m|(1<<x)][x]=x;
}
if(b[ii][x]&&dp[m][i]<dp[m|(1<<x)][i])
{
dp[m|(1<<x)][x]=dp[m][i];
nxt[m|(1<<x)][x]=i;
v[m|(1<<x)][x]=ii;
}
}
}
}
}
for(i=0;i<n;i++)
{
if(dp[(1<<n)-1][i]<sol)
{
sol=dp[(1<<n)-1][i];
soli=i;
}
}
for(m=(1<<n)-1;m;m^=(1<<p))
{
if(v[m][soli]==soli) nr[++nr[0]]=soli;
p=soli;
soli=nxt[m][soli];
}
//printf("%d\n", *min_element(dp[(2<<n)-2]+1, dp[(2<<n)-2]+n+1));
printf("%s", a[nr[nr[0]]]+1);
for(i=nr[0]-1;i>0;i--)
{
printf("%s", a[nr[i]]+c[nr[i+1]][nr[i]]+1);
}
}