Pagini recente » Cod sursa (job #2744815) | Cod sursa (job #3173908) | Cod sursa (job #2513692) | Cod sursa (job #775670) | Cod sursa (job #602658)
Cod sursa(job #602658)
#include <fstream.h>
#define MAXS 30050
#define MAX 19
#define MAX2n 270000
int n;
char sir[MAX][MAXS];
int len[MAX];
int pi[MAX][MAXS];
int inclus[MAX];
int l[MAX][MAX];
int prec[MAX2n][MAX];
long opt[MAX2n][MAX];
long pow2[MAX];
long Back(long config, int last)
{
if(prec[config][last]!=0)
return opt[config][last];
int i;
long config2 = config ^ pow2[last];
long optm = 0;
prec[config][last] = -1;
for(i=0;i<n;i++) if(i!=last)
if( (config & pow2[i])!=0 )
{
long optc=Back(config2, i);
if(optc + l[i][last] > optm)
{
prec[config][last] = i+1;
optm = optc + l[i][last];
}
}
opt[config][last] = optm;
return optm;
}
ifstream in("adn.in");
ofstream out("adn.out");
void Print(long config, int i)
{
long config2 = config ^ pow2[i];
Print(config2, prec[config][i]);
out<<sir[i];
}
int main()
{
in>>n;
int i,j;
for(i=0;i<n;i++)
{ in>>sir[i]; len[i]=strlen(sir[i]); }
for(i=0;i<n;i++)
{
pi[i][0]=1;
int k=1;
for(j=1;j<len[i];j++)
{
while(k>0)
{
if(sir[i][j] != sir[i][k])
k = pi[i][k-1];
else
break;
}
if(sir[i][j] == sir[i][k]) pi[i][j] = ++k;
else pi[i][j] = 0;
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++) if(i!=j)
{
int k=0;
int p;
for(p=0;p<len[i];p++)
{
while(k>0)
{
if(sir[i][p] != sir[j][k])
k = pi[j][k-1];
else
break;
}
if(sir[i][p] == sir[j][k]) ++k;
else k = 0;
if(k==len[j])
{
inclus[j] = 1;
break;
}
}
l[i][j] = k;
}
pow2[0]=1;
for(i=1;i<=n;i++)
pow2[i] = pow2[i-1]*2;
int optm = Back(pow2[n]-1,0);
int opti = 0;
for(i=1;i<n;i++)
{
long optt = Back(pow2[n]-1,i);
if(optt > optm)
{
optm = optt;
opti = i;
}
}
Print(pow2[n]-1, opti);
out<<"\n";
return 0;
}