Cod sursa(job #2037705)

Utilizator LucaSeriSeritan Luca LucaSeri Data 12 octombrie 2017 17:51:14
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<bits/stdc++.h>

using namespace std;

struct nod{
    int valpref;
    int valapar;
    nod *fiu[26];
    nod(){
        this->valpref = 0;
        this->valapar = 0;
        for(int i = 0; i <= 25; ++i){
            this->fiu[i] = NULL;
        }
    }
};

nod *root = new nod();

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

string s;
void add(nod* node, int poz){
        if(poz == s.size()) node->valapar ++;
        else node->valpref ++;
        if(poz == s.size()) return;
        int lit = (int)s[poz] - 'a';
        if(node->fiu[lit] == NULL) node->fiu[lit] = new nod();
        add(node->fiu[lit], poz+1);
}

void erase(nod* node, int poz){
    if(poz == s.size()) node->valapar--;
    else node->valpref --;
    if(poz == s.size()) return;
    int lit = s[poz] - 'a';
    erase(node->fiu[lit], poz+1);
}

int nrapar(nod* node, int poz){
    if(poz == s.size()) return node->valapar;
    int lit = s[poz]-'a';
    if(node->fiu[lit] == NULL) return 0;
    return nrapar(node->fiu[lit], poz+1);
}

int prefix(nod* node, int poz){
    if(node->valpref == 0 && node->valapar == 0) return poz-1;
    if(poz == s.size()) return poz;
    int lit = s[poz]-'a';
    if(node->fiu[lit] == NULL) return poz;
    else return prefix(node->fiu[lit], poz+1);
}
int main(){
    int cd;
    while(f >> cd){
        f >> s;
        if(cd == 0){
            add(root,0);
        }
        if(cd == 1){
            erase(root, 0);
        }
        if(cd == 2){
            g << nrapar(root, 0) << '\n';
        }
        if(cd == 3){
            g << prefix(root, 0) << '\n';
        }
    }
}