Cod sursa(job #2508382)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 11 decembrie 2019 23:18:10
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int cod;
char s[25];
struct trie{
    int fii=0, nr=0;
    trie *f[26];
    trie() {
        for (int i=0;i<26;i++)
            f[i]=0;
    }
};
trie *rad=new trie;
void insertTrie(trie *r,char *s) {
    if (*s!=0) {
        if (r->f[*s-'a']==0) {
            r->f[*s-'a']=new trie;
            r->fii++;
        }
        insertTrie(r->f[*s-'a'],s+1);
    }
    else
        r->nr++; //numarul de aparitii
}
int deleteTrie(trie *&r,char *s) {
    if (*s==0) {
        r->nr--;
        if (r->nr==0&&r->fii==0&&r!=rad) { //daca nu mai apare in lista si nu mai are nimic in jos
            delete r;
            r=nullptr;
            return 1;
        }
    }
    else {
        if (deleteTrie(r->f[*s-'a'],s+1)) {
            r->fii--;
            if (r->nr==0&&r->fii==0&&r!=rad) {
                delete r;
                r=nullptr;
                return 1;
            }
        }
    }
    return 0;
}
int queryTrie(trie *r,char *s) {
    if (*s==0)
        return r->nr;
    if (r->f[*s-'a']==nullptr)
        return 0;
    else
        return queryTrie(r->f[*s-'a'],s+1);
}
int prefixTrie(trie *r,char *s) {
    if (*s==0)
        return 0;
    if (r->f[*s-'a']==nullptr)
        return 0;
    else
        return 1+prefixTrie(r->f[*s-'a'],s+1);
}
int main() {
    while (fin>>cod>>s) {
        switch (cod) {
            case 0: insertTrie(rad,s);
                    break;
            case 1: deleteTrie(rad,s);
                    break;
            case 2: fout<<queryTrie(rad,s)<<"\n";
                    break;
            case 3: fout<<prefixTrie(rad,s)<<"\n";
                    break;
        }
    }
    return 0;
}