Cod sursa(job #1591799)

Utilizator cristian.caldareaCaldarea Cristian Daniel cristian.caldarea Data 6 februarie 2016 18:37:23
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

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

const int DimC = 22;

struct Nod
{
    Nod()
    {
        nr_c = 0;
        memset( son, 0, sizeof(son) );

    }
    int nr_c;
    Nod* son[4];
};

int n, m, l, nr;
Nod* T = new Nod;

string txt;
char cuv[DimC];
vector<string> G;

void Read();
void Insert(Nod* &nod, int i, int j);
int Count( Nod* nod, const char *s);
int main()
{
    Read();
    sort(G.begin(), G.end());
    unique(G.begin(), G.end());
    m = txt.size();
   // fout << l << ' ' << n;
    for ( int i = 0; i <= m - l; i++ )
    {
        Insert( T , i, i + l - 1 );

    }
    for ( auto y : G )
    {
        nr += Count( T, y.c_str() );
       // fout << '\n';
    }
    fout << nr;
    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    getline(fin, txt);
    while ( fin.getline( cuv, DimC ) )
    {
        n++;
      //  cout << cuv << '\n';;
        if ( l == 0 )
            l = strlen(cuv);
        G.push_back(cuv);
    }
}

void Insert(Nod* &nod, int i, int j)
{
	if ( i > j )
        return;

    if ( nod == 0 )
        nod = new Nod;
    nod->nr_c++;

    Insert( nod->son[txt[i] - 'a'], i + 1, j);

}
int Count( Nod* nod, const char *s)
{
    if ( *(s + 1) == '\0' )
    {
        //fout << nod->nr_c << ' ';
        return nod->nr_c;
    }
    if ( nod->son[*s - 'a'] )
        return Count(nod->son[*s - 'a'], s + 1);
    return 0;
}