Cod sursa(job #2063966)

Utilizator MaligMamaliga cu smantana Malig Data 11 noiembrie 2017 17:34:35
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <cstring>

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

#define ll long long
#define ull unsigned long long
#define pb push_back
const int NMax = 1e3 + 5;

int T;

struct nodTrie {
    int nrApp,nrSub;
    nodTrie *nxt[26];

    nodTrie() {
        nrApp = nrSub = 0;
        for (int i=0;i < 26;++i) {
            nxt[i] = NULL;
        }
    }
}root;

void add(nodTrie*,const string&,int);
void sub(nodTrie*,const string&,int);
int queryApp(nodTrie*,const string&,int);
int queryPrefix(nodTrie*,const string&,int);

int main() {
    int tip;
    string cuv;

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

        if (tip == 0) {
            add(&root,cuv,0);
        }
        else if (tip == 1) {
            sub(&root,cuv,0);
        }
        else if (tip == 2) {
            out<<queryApp(&root,cuv,0)<<'\n';
        }
        else {
            out<<queryPrefix(&root,cuv,0)<<'\n';
        }

        in>>tip;
    }

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

#define urm (nod->nxt[cuv[idx]-'a'])
void add(nodTrie* nod,const string& cuv,int idx) {
    if (idx == cuv.size()) {
        nod->nrApp += 1;
        nod->nrSub += 1;
        return;
    }

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

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

void sub(nodTrie* nod,const string& cuv,int idx) {
    if (idx == cuv.size()) {
        nod->nrApp -= 1;
        nod->nrSub -= 1;
        return;
    }

    sub(urm,cuv,idx+1);

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

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

    if (urm == NULL) {
        return 0;
    }

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

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

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