Pagini recente » Cod sursa (job #795439) | Cod sursa (job #1781981) | Cod sursa (job #2564085) | Cod sursa (job #365830) | Cod sursa (job #474040)
Cod sursa(job #474040)
#include<algorithm>
#include<string.h>
using namespace std;
#define N_MAX 18
#define L_MAX 30005
#define MAX 1<<29
int Kmp[L_MAX];
char c[N_MAX][L_MAX];
int i,j,n,k;
int cost[N_MAX][N_MAX];
#define CONFIG 1<<N_MAX
int dp[CONFIG][N_MAX];
int t[CONFIG][N_MAX];
void Prefix(char *c)
{
memset(Kmp,0,sizeof(Kmp));
int sz=strlen(c + 1),i;
int k=0;
for(i=2;i<=sz;i++)
{
while(k>0&&c[k+1]!=c[i])
k=Kmp[k];
if(c[k+1]==c[i])
++k;
Kmp[i]=k;
}
}
int Cmp(char *x,char *y)
{
int szx=strlen(x + 1),szy=strlen(y + 1);
Prefix(y);
int k=0,i;
for(i=1;i<=szx;i++)
{
while(k>0&&y[k+1]!=x[i])
k=Kmp[k];
if(y[k+1]==x[i])
++k;
if(k==szy)
return k;
}
return k;
}
int OK=1;
void REC(int config,int i)
{
if(i==-1)
return;
REC(config-(1<<i),t[config][i]);
if(OK)
{
printf("%s",c[i] + 1);
OK=0;
}
else
printf("%s",c[i]+cost[t[config][i]][i]+1);
}
int main()
{
freopen("adn.in","r",stdin);
freopen("adn.out","w",stdout);
scanf("%d\n",&n);
for(i=0;i<n;i++)
{
c[i][0]=' ';
scanf("%s",(c[i]+1));
}
for(i=0;i<CONFIG;i++)
for(j=0;j<n;j++)
dp[i][j]=-MAX,t[i][j]=-1;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
cost[i][j]=(1<<30);
else
cost[i][j]=Cmp(c[i],c[j]);
dp[(1<<j)][j]=0;
}
}
for(i=0;i<(1<<n);i++)
{
for(j=0;j<n;j++)
{
if((i&(1<<j))==0)
continue;
for(k=0;k<n;k++)
{
if((i&(1<<k))==0||k==j)
continue;
if(dp[i][j]<dp[i-(1<<j)][k]+cost[k][j])
{
dp[i][j]=dp[i-(1<<j)][k]+cost[k][j];
t[i][j]=k;
}
}
}
}
int Min=0,ind=0;
for(i=1;i<n;i++)
if(Min>dp[(1<<n)-1][i])
Min=dp[(1<<n)-1][i],ind=i;
REC((1<<n)-1,ind);
return 0;
}