Cod sursa(job #2036905)

Utilizator LucaSeriSeritan Luca LucaSeri Data 11 octombrie 2017 12:07:45
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 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");

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

void erase(nod* node, string s, 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], s, poz+1);
}

int nrapar(nod* node, string s, 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], s, poz+1);
}

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