Cod sursa(job #1612669)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 24 februarie 2016 23:14:14
Problema ADN Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#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;
}