Cod sursa(job #2310889)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 2 ianuarie 2019 12:41:16
Problema ADN Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.23 kb
#include <bits/stdc++.h>
#define usu(x) (1<<(x-1))
#define inf 1<<30
using namespace std;
ifstream f ("adn.in");
ofstream g ("adn.out");
const int nmax=103;
const int lmax=35e3+3;
char s[nmax][lmax];
int v[nmax][nmax],t[nmax],A[1<<18][19],ant[lmax],N,K;
void prefix(char N[],int n)
{
	int k=0;
	ant[0]=0;
	for(int i=1;i<=n;++i)
	{
		while(k&&N[k]!=N[i]) k=ant[k-1];
		if(N[k]==N[i]) ++k;
		ant[i]=k;
	}
}
int kmp(char N[],char M[],int n,int m)
{
	int q=0;
	for(int i=0;i<=m;++i)
	{
		while(q&&N[q]!=M[i]) q=ant[q-1];
		if(N[q]==M[i]) ++q;
		if(q==n+1) return inf;
	}
	return q;
}
void print(int x,int y)
{
	if(x==usu(y))
	{
		g<<s[y];
		return;
	}
	for(int i=1;i<=N;++i)
    {
        if(A[x^usu(y)][i]-v[i][y]==A[x][y])
		{
			print(x^usu(y),i);
			g<<(s[y]+v[i][y]);
			return;
		}
    }
}
int main()
{
	f>>N;
	for(int i=1;i<=N;++i)
	{
		f>>s[i];
		t[i]=strlen(s[i])-1;
	}
	K=(1<<N)-1;
	memset(A,100,sizeof(A));
	A[0][0]=0;
	for(int i=1;i<=N;++i)
	{
	    for(int j=1;j<=N;++j)
        {
            if(i!=j&&(K&usu(j)))
            {
                prefix(s[j],t[j]);
                v[i][j]=kmp(s[j],s[i],t[j],t[i]);
                if(v[i][j]==inf)
                K^=usu(j);
            }
        }
	}
	for(int i=1;i<=K;++i)
	{
	    for(int j=1;j<=N;++j)
        {
            if(!usu(j)&(i||K)) continue;
            for(int k=0;k<=N;++k)
            {
                if(k==j) continue;
                A[i][j]=min(A[i][j],A[i^usu(j)][k]-v[k][j]);
            }
        }
	}
	int poz(0);
	A[K][0]=inf;
	for(int i=1;i<=N;++i) if(A[K][i]<A[K][poz]) poz=i;
	print(K,poz);
	return 0;
}
//Priviţi, măreţe umbre, Mihai, Ştefan, Corvine,
//Româna naţiune, ai voştri strănepoţi,
//Cu braţele armate, cu focul vostru-n vine,
//"Viaţă-n libertate ori moarte! " strigă toţi.
//
//Pre voi vă nimiciră a pizmei răutate
//Şi oarba neunire la Milcov şi Carpaţi!
//Dar noi, pătrunşi la suflet de sfânta libertate,
//Jurăm că vom da mâna, să fim pururea fraţi!
//
//O mamă văduvită de la Mihai cel Mare
//Pretinde de la fii-şi azi mână d-ajutori,
//Şi blastămă cu lacrimi în ochi pe orişicare,
//În astfel de pericol s-ar face vânzători!
//
//De fulgere să piară, de trăsnet şi pucioasă,
//Oricare s-ar retrage din gloriosul loc,
//Când patria sau mama, cu inimă duioasă,
//Va cere ca să trecem prin sabie şi foc!
//
//N-ajunse iataganul barbarei semilune,
//https://Versuri.ro/w/v0l2
//A cărui plăgi fatale şi azi le mai simţim;
//Acum se vâră cnuta în vetrele străbune,
//Dar martor ne e Domnul că vii nu o primim!
//
//N-ajunse despotismul cu-ntreaga lui orbie,
//Al cărui jug din seculi ca vitele-l purtăm ;
//Acum se-ncearcă cruzii, în oarba lor trufie,
//Să ne răpească limba, dar morţi numai o dăm!
//
//Români din patru unghiuri, acum ori niciodată
//Uniţi-vă în cuget, uniţi-vă-n simţiri!
//Strigaţi în lumea largă că Dunărea-i furată
//Prin intrigă şi silă, viclene uneltiri!
//
//Preoţi, cu cruce-n frunte! căci oastea e creştină,
//Deviza-i libertate şi scopul ei preasfânt.
//Murim mai bine-n luptă, cu glorie deplină,
//Decât să fim sclavi iarăşi în vechiul nost' pământ!