Cod sursa(job #1995594)

Utilizator MaligMamaliga cu smantana Malig Data 28 iunie 2017 16:23:56
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

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

#define ll long long
#define pb push_back
#define ui unsigned int
const int inf = 1e9 + 5;
const int NMax = 5e4 + 5;

int N,M;

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

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

void update(nodTrie*,const string&,int,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;

        switch(tip) {
        case 2: {
            out<<queryApp(&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;
}

#define idx (cuv[pos] - 'a')
#define urm (node -> nxt[idx])

void update(nodTrie *node,const string& cuv,int pos,int add) {
    node -> nrSub += add;

    if (cuv.size() == pos) {
        node -> app += add;
        return;
    }

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

    update(urm,cuv,pos+1,add);

    if (urm -> nrSub == 0) {
        delete urm;
        urm = 0;
    }
}
int queryApp(nodTrie *node,const string& cuv,int pos) {
    if (cuv.size() == pos) {
        return node -> app;
    }

    if (urm == 0) {
        return 0;
    }
    return queryApp(urm,cuv,pos+1);
}

int queryPrefix(nodTrie *node,const string& cuv,int pos) {
    if (urm == 0 || cuv.size() == pos) {
        return pos;
    }

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