Cod sursa(job #1855978)

Utilizator borcanirobertBorcani Robert borcanirobert Data 24 ianuarie 2017 13:48:28
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <vector>
using namespace std;

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

const int MAXL = 110;
struct Trie{
    int nrfii, cnt;
    int fii[26];
};
vector<Trie> T;
Trie x;

void New();
void Add( char *word, int nod );
void Delete( char *word, int nod );
int NrCuv( int nod, char *word );
int LungimePrefix( int nod, char *cuv, int k );

int main()
{
    int N, i;
    int x;
    char c[MAXL];
    New();

    while ( fin >> x >> c )
    {
        if ( x == 0 ) Add(c, 0);
        if ( x == 1 ) Delete(c, 0);
        if ( x == 2 ) fout << NrCuv(0, c) << '\n';
        if ( x == 3 ) fout << LungimePrefix(0, c, 0) << '\n';
    }

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


void New()
{
    T.push_back(x);
}

void Add( char *word, int nod )
{
    if ( *word == '\0' )
    {
        T[nod].cnt++;
        return;
    }

    char l = *word - 'a';
    int poz;
    if ( T[nod].fii[l] == 0 )
    {
        T[nod].nrfii++;
        New();
        poz = T[nod].fii[l] = T.size() - 1;
    }
    else
        poz = T[nod].fii[l];

    Add(word + 1, poz);
}

void Delete( char *word, int nod )
{
    if ( *word == '\0' )
    {
        T[nod].cnt--;
        return;
    }

    int l = *word - 'a';
    int fiu = T[nod].fii[l];
    Delete(word + 1, fiu);

    if ( T[fiu].cnt == 0 && T[fiu].nrfii == 0 )
        T[nod].nrfii--, T[nod].fii[l] = 0;
}

int NrCuv( int nod, char *word )
{
    if ( *word == '\0' )
    {
        return T[nod].cnt;
    }

    int l = *word - 'a';
    int fiu = T[nod].fii[l];

    if ( T[nod].fii[l] == 0 )
        return 0;

    return NrCuv(fiu, word + 1);
}

int LungimePrefix( int nod, char *cuv, int k )
{
    int l = *cuv - 'a';
    if ( *cuv == '\0' || T[nod].fii[l] == 0 )
        return k;
    return LungimePrefix(T[nod].fii[l], cuv + 1, k + 1);
}