Cod sursa(job #2609847)

Utilizator victorzarzuZarzu Victor victorzarzu Data 3 mai 2020 17:23:08
Problema ADN Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <bits/stdc++.h>
#define MAXN 1 << 18
#define oo 0x3f3f3f3f

using namespace std;
ifstream f("adn.in");
ofstream g("adn.out");
struct prv
{
  int mask, text;
};

prv P[MAXN + 5][18];
int n, minim = oo, poz;
string text[18];
short pi[30005];
short C[MAXN + 5][18], Cost[18][18];

void Read()
{
  f>>n;
  for(int i = 0;i < n;++i)
    f>>text[i];
  memset(C, oo, sizeof(C));
}

void compute(string cuv)
{
  int q = 0;
  pi[1] = 0;
  for(int i = 2;i <= cuv.length();++i)
    {
      while(q && cuv[q] != cuv[i - 1])
        q = pi[q];
      if(cuv[q] == cuv[i - 1])
        ++q;
      pi[i] = q;
    }
}

int KMP(string cuv1, string cuv2)
{
  int q = 0;
  for(int i = 1;i <= cuv2.length();++i)
    {
      while(q && cuv1[q] != cuv2[i - 1])
        q = pi[q];
      if(cuv1[q] == cuv2[i - 1])
        ++q;
      if(q == cuv1.length() - 1)
        return 0;
    }
  return cuv1.length() - q;
}

void reconstruct(int mask, int varf)
{
  if(P[mask][varf].text == -1)
    {
      for(int i = 0;i < n;++i)
        if(mask & (1 << i))
          {
            g<<text[varf];
            return;
          }
    }
  reconstruct(P[mask][varf].mask, P[mask][varf].text);
  if(Cost[P[mask][varf].text][varf])
  {
    string result = text[varf].substr(text[varf].length() - Cost[P[mask][varf].text][varf]);
    g<<result;
  }
}

void lant()
{
  for(int mask = 1;mask < (1 << n);++mask)
    for(int pos = 0;pos < n;++pos)
      if(mask & (1 << pos))
        {
          int mask2 = mask ^ (1 << pos);
          if(mask2 == 0)
            {
              P[mask][pos] = {0, -1};
              C[mask][pos] = text[pos].length();
              break;
            }
          for(int j = 0;j < n;++j)
            if(mask2 & (1 << j))
            {
              if(C[mask2][j] + Cost[j][pos] < C[mask][pos])
                {
                  C[mask][pos] = C[mask2][j] + Cost[j][pos];
                  P[mask][pos] = {mask2, j};
                }
            }
        }
  for(int i = 0;i < n;++i)
    if(C[(1 << n) - 1][i] < minim)
      minim = C[(1 << n) - 1][i], poz = i;
  reconstruct((1 << n) - 1, poz);
}

void Solve()
{
  for(int i = 0;i < n;++i)
    for(int j = 0;j < n;++j)
      if(i != j)
        Cost[j][i] = KMP(text[i], text[j]);
  lant();
}

int main()
{
  Read();
  Solve();
  return 0;
}