Cod sursa(job #2515367)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 28 decembrie 2019 14:03:31
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <cstring>
using namespace std;

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

int cer;
char a[25];
int n;
struct trie{
    int nrcnt;
    int nrfii;
    trie *urm[30];
    trie(){
        nrcnt = 0;
        nrfii = 0;
        memset(urm, NULL, sizeof(urm));
    }
};
trie *p = new trie();
void adaug(trie *&q, int poz){
    if(poz == n)
        return;
    if(!q->urm[a[poz]-'a']){
        trie *nou = new trie();
        //nou->adancime = poz+1;
        q->nrfii++;
        q->urm[a[poz]-'a'] = nou;
    }
    q->urm[a[poz]-'a']->nrcnt++;
    adaug(q->urm[a[poz]-'a'], poz+1);
}

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

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

int prefix(trie *q, int poz, int k){
    if(!q->urm[a[poz]-'a'] || q->urm[a[poz]-'a']->nrcnt==0)
        return k;
    return prefix(q->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){
            g<<nraparitii(p, 0)<<'\n';
        }
        else g<<prefix(p, 0, 0)<<'\n';
    }
    return 0;
}