Cod sursa(job #1963657)

Utilizator MaligMamaliga cu smantana Malig Data 12 aprilie 2017 17:59:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <fstream>

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

#define ind str[poz] - 'a'

struct nodTrie {
    int app,appSub;
    nodTrie *next[26];
    nodTrie() {
        app = appSub = 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 == 2) {
            out<<queryApp(start,cuv,0)<<'\n';
        }
        else if (tip == 3) {
            out<<queryPrefix(start,cuv,0)<<'\n';
        }
        else {
            int add = (tip) ? -1 : +1;
            update(start,cuv,0,add);
        }


        in>>tip;
    }

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

void update(nodTrie& nod,const string& str,int poz,int add) {
    if ((int)str.size() == poz) {
        nod.app += add;
        nod.appSub += add;
        return;
    }

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

    update(*urm,str,poz+1,add);
    nod.appSub += add;

    if (urm->appSub == 0) {
        delete urm;
        nod.next[ind] = nullptr;
    }
}
int queryApp(nodTrie& nod,const string& str,int poz) {
    if ((int)str.size() == poz) {
        return nod.app;
    }

    nodTrie *urm = nod.next[ind];
    if (urm != nullptr) {
        return queryApp(*urm,str,poz+1);
    }
    return 0;
}
int queryPrefix(nodTrie& nod,const string& str,int poz) {
    nodTrie *urm = nod.next[ind];
    if ((int)str.size() == poz || urm == nullptr) {
        return poz;
    }

    return queryPrefix(*urm,str,poz+1);
}