Cod sursa(job #1982751)

Utilizator MaligMamaliga cu smantana Malig Data 20 mai 2017 10:29:32
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");

#define ll long long
#define pb push_back
const int NMax = 5e4 + 5;
#define urm nod->nxt[cuv[idx] - 'a']

int N;

struct nodTrie {
    int ap,nrSub;
    nodTrie *nxt[26];
    nodTrie() {
        ap = nrSub = 0;
        for (int i=0;i < 26;++i) {
            nxt[i] = 0;
        }
    }
}root;

void update(nodTrie*,const string&,int,int);
int query(nodTrie*,const string&,int);
int queryPrefix(nodTrie*,const string&,int);

int main() {
    int tip;
    string cuv;

    in>>tip;
    while(!in.fail()) {
        in>>cuv;

        switch(tip) {
        case 2: {
            out<<query(&root,cuv,0)<<'\n';
            break;
        }
        case 3: {
            out<<queryPrefix(&root,cuv,0)<<'\n';
            break;
        }
        default: {
            int add = (tip) ? -1 : +1;
            update(&root,cuv,0,add);
        }
        }

        in>>tip;
    }

    in.close();out.close();
    return 0;
}

void update(nodTrie* nod,const string& cuv,int idx,int add) {
    if (cuv.size() == idx) {
        nod -> ap += add;
        nod -> nrSub += add;
        return;
    }

    if (urm == nullptr) {
        urm = new nodTrie;
    }

    update(urm,cuv,idx+1,add);
    nod -> nrSub += add;

    if (urm -> nrSub == 0) {
        delete urm;
        urm = 0;
    }
}

int query(nodTrie* nod,const string& cuv,int idx) {
    if (cuv.size() == idx) {
        return nod -> ap;
    }

    if (urm == nullptr) {
        return 0;
    }
    return query(urm,cuv,idx+1);
}

int queryPrefix(nodTrie* nod,const string& cuv,int idx) {
    if (urm == nullptr || cuv.size() == idx) {
        return idx;
    }

    return queryPrefix(urm,cuv,idx+1);
}