Cod sursa(job #1751667)

Utilizator razvandRazvan Dumitru razvand Data 1 septembrie 2016 18:25:08
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

struct node {
    int am;
    int en;
    node* ve[30];
    node() {
        am = 0;
        en = 0;
        for(int i = 0; i < 30; i++)
            ve[i] = NULL;
    }
};

struct trie {

    node *root;

    trie() {
        root = new node();
        root->am = 123123123;
    }

    void add(string s) {
        node *ro = root;
        for(int i = 0; i < s.size(); i++) {
            if(ro->ve[s[i]-'a'] == NULL)
                ro->ve[s[i]-'a'] = new node();
            ro = ro->ve[s[i]-'a'];
            ro->am++;
        }
        ro->en++;
    }

    void rem(string s) {
        node *ro = root;
        node *te = ro;
        stack<node*> del;
        for(int i = 0; i < s.size(); i++) {
            te = ro;
            ro = ro->ve[s[i]-'a'];
            ro->am--;
            if(ro->am == 0) {
                te->ve[s[i]-'a'] = NULL;
                del.push(ro);
            }
        }
        ro->en--;
        while(!del.empty()) {
            delete del.top();
            del.pop();
        }
    }

    int ap(string s) {
        node *ro = root;
        for(int i = 0; i < s.size(); i++) {
            if(ro->ve[s[i]-'a'] == NULL)
                return 0;
            ro = ro->ve[s[i]-'a'];
        }
        return ro->en;
    }

    int ln(string s) {
        node *ro = root;
        for(int i = 0; i < s.size(); i++) {
            if(ro->ve[s[i]-'a'] == NULL) {
                return i;
            }
            ro = ro->ve[s[i]-'a'];
        }
        return s.size();
    }

};

int T = 0;

int main() {

    int t;
    string S;
    trie T;

    while(in >> t) {

        in >> S;

        if(t == 0)
            T.add(S);
        if(t == 1)
            T.rem(S);
        if(t == 2)
            out << T.ap(S) << '\n';
        if(t == 3)
            out << T.ln(S) << '\n';

    }

    return 0;
}