Cod sursa(job #1935719)

Utilizator borcanirobertBorcani Robert borcanirobert Data 22 martie 2017 16:55:34
Problema ADN Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

ifstream fin("adn.in");
ofstream fout("adn.out");

const int MAX = 18;
int N;
vector<string> a, s;
int D[1<<MAX][MAX];
int b[MAX][MAX];

void Read();
void Solve();
bool Check( string a, string b, int p );

int main()
{
    Read();
    Solve();

    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    fin >> N; fin.get();
    a = vector<string>(N);
    for ( int i = 0; i < N; ++i )
    {
        fin >> a[i];
    }

    vector<bool> g(N, 0);
    for ( int i = 0; i < N; ++i )
        for ( int j = 0; j < N; ++j )
            if ( i != j && a[i].size() >= a[j].size() && a[i].find(a[j]) != string::npos )
                g[j] = true;

    int c{0};
    for ( int i = 0; i < N; ++i )
        if ( !g[i] )
            s.push_back(a[i]);
        else
            ++c;
    N -= c;

   /* for ( int i = 0; i < N; ++i )
        fout << s[i] << '\n';   */
}

void Solve()
{
    int i, j;

    for ( i = 0; i < N; ++i )
        for ( j = 0; j < N; ++j )
            if ( i != j )
            {
                int t, r;

                for ( t = min(s[i].size(), s[j].size()) - 1; t >= 0; --t )
                    if ( Check(s[i], s[j], t) )
                    {
                        r = t;
                        break;
                    }

                D[i][j] = r;
               // fout << s[i] << ' ' << s[j] << ' ' << D[i][j] << '\n';
            }
}

bool Check( string a, string b, int p )
{
    if ( p == 0 ) return true;
    int i1 = a.size() - p, i2 = 0;

    while ( i1 < a.size() )
        if ( a[i1++] != b[i2++] )
            return false;
    return true;
}