Cod sursa(job #1956978)

Utilizator dumbraveanbDumbravean Bogdan dumbraveanb Data 7 aprilie 2017 10:46:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

#define lit (*s - 'a')

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

struct Trie {
    int cnt, nrfii;
    Trie *fiu[26];

    Trie() {
        cnt = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

Trie *T = new Trie;


void Ins(Trie *nod, char *s) {
    if(*s == 0) {
        nod->cnt++;
        return;
    }
    if(nod->fiu[lit] == 0) {
        nod->fiu[lit] = new Trie;
        nod->nrfii++;
    }
    Ins(nod->fiu[lit], s + 1);
}

bool Del(Trie *nod, char *s) {
    if(*s == 0)
        --nod->cnt;
    else if(Del(nod->fiu[lit], s + 1)) {
        --nod->nrfii;
        nod->fiu[lit] = 0;
    }
    if(nod != T && nod->cnt == 0 && nod->nrfii == 0) {
        delete nod;
        return 1;
    }
    return 0;
}

int NrAp(Trie *nod, char *s) {
    if(*s == 0)
        return nod->cnt;
    if(nod->fiu[lit])
        return NrAp(nod->fiu[lit], s + 1);
    return 0;
}

int Pref(Trie *nod, char *s, int k) {
    if(*s == 0 || nod->fiu[lit] == 0)
        return k;
    return Pref(nod->fiu[lit], s + 1, k + 1);
}

int main()
{
    char s[25];

    while(fin.getline(s, 25)) {
        switch(s[0]) {
            case '0' : Ins(T, s + 2); break;
            case '1' : Del(T, s + 2); break;
            case '2' : fout << NrAp(T, s + 2) << '\n'; break;
            case '3' : fout << Pref(T, s + 2, 0) << '\n'; break;
        }
    }
    return 0;
}