Cod sursa(job #1973670)

Utilizator MaligMamaliga cu smantana Malig Data 25 aprilie 2017 18:01:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iomanip>

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

#define idx cuv[pos] - 'a'
typedef long long ll;
const int NMax = 1e5 + 5;

struct nodTrie {
    int app,appFii;
    nodTrie *next[26];
    nodTrie() {
        app = appFii = 0;
        for (int i=0;i<26;++i) {
            next[i] = nullptr;
        }
    }
}start;

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;

        if (tip == 3) {
            out<<queryPrefix(start,cuv,0)<<'\n';
        }
        else if (tip == 2) {
            out<<queryApp(start,cuv,0)<<'\n';
        }
        else {
            int add = (tip == 0) ? +1 : -1;
            update(start,cuv,0,add);
        }

        in>>tip;
    }

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

void update(nodTrie& nod,const string& cuv,int pos,int add) {
    if (cuv.size() == pos) {
        nod.app += add;
        nod.appFii += add;
        return;
    }

    if (nod.next[idx] == nullptr) {
        nod.next[idx] = new nodTrie;
    }
    nodTrie *urm = nod.next[idx];

    nod.appFii += add;
    update(*urm,cuv,pos+1,add);

    if (urm->appFii == 0) {
        delete urm;
        nod.next[idx] = nullptr;
    }
}

int queryApp(nodTrie& nod,const string& cuv,int pos) {
    if (cuv.size() == pos) {
        return nod.app;
    }

    nodTrie *urm = nod.next[idx];
    if (urm == nullptr) {
        return 0;
    }

    return queryApp(*urm,cuv,pos+1);
}

int queryPrefix(nodTrie& nod,const string& cuv,int pos) {
    if (nod.next[idx] == nullptr || cuv.size() == pos) {
        return pos;
    }

    nodTrie *urm = nod.next[idx];
    return queryPrefix(*urm,cuv,pos+1);
}