Cod sursa(job #2553555)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 22 februarie 2020 09:42:10
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <cstring>
using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct trie{
    int nrcnt;
    int fin;

    trie *urm[30];
    trie(){
        nrcnt=0;
        fin=0;
        memset(urm, NULL, sizeof(urm));
    }


};

trie *p = new trie();

int cer, n;
char a[25];

void adaug(trie *&p, int poz){
    if(poz == n){
        p->fin++;
        return;
    }

    if(!p->urm[a[poz]-'a']){
        p->urm[a[poz]-'a'] = new trie();
    }
    p->urm[a[poz]-'a']->nrcnt++;
    adaug(p->urm[a[poz]-'a'], poz+1);
}

void sterg(trie *&p, int poz){
    if(poz == n){
        p->fin--;
        return;
    }
    p->urm[a[poz]-'a']->nrcnt--;
    sterg(p->urm[a[poz]-'a'], poz+1);
}

int nraparitii(trie *p, int poz){
    if(poz == n)
        return p->fin;
    if(p->urm[a[poz]-'a'])
        return nraparitii(p->urm[a[poz]-'a'], poz+1);
    return 0;
}

int prefix(trie *p, int poz, int k){
    if(poz==n)
        return n;
    if(!p->urm[a[poz]-'a'] || p->urm[a[poz]-'a']->nrcnt == 0)
        return k;
    return prefix(p->urm[a[poz]-'a'], poz+1, k+1);
}
int main()
{
    while(f>>cer>>a){
        n=strlen(a);
        if(cer == 0){
            adaug(p, 0);
        }
        else if(cer ==1)
            sterg(p, 0);
        else if(cer == 2){
            if(!p->urm[a[0]-'a'])
                g<<"0"<<'\n';
            else g<<nraparitii(p, 0)<<'\n';
        }
        else{
            g<<prefix(p, 0, 0)<<'\n';
        }
    }


    return 0;
}