Cod sursa(job #1891567)

Utilizator LolkekzorChiorean Tudor Lolkekzor Data 24 februarie 2017 09:51:20
Problema Trie Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <fstream>
#include <string>
using namespace std;

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

#define ch cuv[ pos ] - 'a'

struct Trie {
    int ap, sons;
    Trie *fii[ 26 ];

    Trie() {
        ap = sons = 0;
        for (int i = 0 ; i < 26 ; i++) fii[ i ] = NULL;
    }
};

int op, maxi;
Trie *trieRoot = new Trie;
string cuv;

void addTrie( Trie *&aux, int pos ) {
    if ( pos >= cuv.length() ) {
        aux -> ap ++;
    } else {
        if ( aux -> fii[ ch ] == 0 ) {
            aux -> sons ++;
            aux -> fii[ ch ] = new Trie;
        }

        addTrie( aux -> fii[ ch ] , pos + 1 );
    }
}

void delTrie( Trie *&aux, int pos ) {
    if ( pos >= cuv.length() ) {
        aux -> ap --;
        if ( aux -> ap == 0 && aux -> sons == 0 ) {
            delete aux;
            aux = NULL;
        }
    } else if ( aux -> fii[ ch ] == NULL ) {
        return;
    } else {
        delTrie( aux -> fii[ ch ] , pos + 1 );
        if ( aux -> fii[ ch ] == NULL ) {
            aux -> sons --;
            if ( aux -> ap == 0 && aux -> sons == 0 ) {
                delete aux;
                aux = NULL;
            }
        }
    }
}

int cntTrie( Trie *&aux, int pos ) {
    if ( pos >= cuv.length() ) {
        return aux -> ap;
    } else if ( aux -> fii[ ch ] == NULL ) {
        return 0;
    } else {
        return cntTrie( aux -> fii[ ch ] , pos + 1 );
    }
}

int prfixTrie( Trie *&aux, int pos ) {
    if ( aux -> fii[ ch ] && ( aux -> fii[ ch ] -> sons || aux -> fii[ ch ] -> ap ) )
        return prfixTrie( aux -> fii[ ch ] , pos + 1 );
    else
        return pos;
}

int main()
{
    while (fin>>op) {
        fin>>cuv;
        if (op == 0) {
            addTrie(trieRoot, 0);
        } else if (op == 1) {
            delTrie(trieRoot, 0);
        } else if (op == 2) {
            fout<<cntTrie(trieRoot, 0)<<'\n';
        } else {
            fout<<prfixTrie(trieRoot, 0)<<'\n';
        }
    }

    return 0;
}