Cod sursa(job #1891677)

Utilizator vlasiuflaviusVlasiu Flavius vlasiuflavius Data 24 februarie 2017 11:20:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
///FLAVIUS, UBESTE-MA
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define ch (s[0]-'a')

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

struct Trie
{
    int val,suma;
    Trie *v[26];
    Trie()
    {
        val = 0;
        suma = 0;
        for( int i = 0 ; i < 26 ; i++ )
            v[ i ] = 0;
    }
};

Trie *T;

int x;
char s[30];

void adauga( Trie *T , char *s )
{
    if( ch < 0 )
    {
        T -> val = T -> val + 1;
        T -> suma = T -> suma + 1;
        return;
    }
    if( T -> v[ ch ] == 0 )
        T -> v[ ch ] = new Trie();

    T -> suma = T -> suma - T -> v[ ch ] -> suma;
    adauga( T -> v[ ch ] , s + 1 );
    T -> suma = T -> suma + T -> v[ ch ] -> suma;

}

void sterge( Trie *T , char *s )
{
    if( ch < 0 )
    {
        T -> val = T -> val - 1;
        T -> suma = T -> suma - 1;
        return;
    }

    T -> suma = T -> suma - T -> v[ ch ] -> suma;
    sterge( T -> v[ ch ] , s + 1 );
    T -> suma = T -> suma + T -> v[ ch ] -> suma;
    if( T -> v[ ch ] -> suma == 0 )
    {
        delete  T -> v[ ch ];
        T -> v[ ch ] = 0;
    }
}

int aparitii( Trie *T , char *s )
{
    if( ch < 0 )
    {
        return T -> val;
    }

    if( T -> v[ ch ] == 0 )
        return 0;
    return aparitii( T -> v[ ch ] , s + 1 );
}

int suffix( Trie *T , char *s )
{
    if( ch < 0 )
    {
        return 0;
    }
    if( T -> v[ ch ] == 0 || T -> suma == 0 )
        return 0;
    return suffix( T -> v[ ch ] , s + 1 ) + 1;
}

int main()
{
    T = new Trie();
    while( fin>>x )
    {
        fin.get();
        fin.get( s , 25 );
        if( x == 0 )
        {
            adauga( T , s );
        }
        else if( x == 1 )
        {
            sterge( T , s );
        }
        else if( x == 2 )
        {
            fout<<aparitii( T , s )<<'\n';
        }
        else
        {
            fout<<suffix( T , s )<<'\n';
        }
    }

    return 0;
}