Cod sursa(job #1751638)

Utilizator razvandRazvan Dumitru razvand Data 1 septembrie 2016 17:54:51
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

struct trie {

    vector<vector<int>> tr;
    vector<int> en;
    vector<int> ds;
    vector<int> go;
    int ID = 1;

    trie() {
        tr.resize(2);
        ds.resize(30);
        en.resize(2);
        go.resize(2);
        tr[1] = ds;
    }

    void add(string s) {
        int C = 1;
        for(int i = 0; i < s.size(); i++) {
            if(tr[C][s[i]-'a'] == 0) {
                tr.push_back(ds);
                en.push_back(0);
                go.push_back(0);
                tr[C][s[i]-'a'] = ++ID;
                C = ID;
            } else
                C = tr[C][s[i]-'a'];
            go[C]++;
        }
        en[C]++;
    }

    void rem(string s) {
        int C = 1;
        for(int i = 0; i < s.size(); i++) {
            if(tr[C][s[i]-'a'] == 0)
                return;
            C = tr[C][s[i]-'a'];
            go[C]--;
        }
        en[C]--;
    }

    int ap(string s) {
        int C = 1;
        for(int i = 0; i < s.size(); i++) {
            if(tr[C][s[i]-'a'] == 0)
                return 0;
            C = tr[C][s[i]-'a'];
            if(go[C] <= 0)
                return 0;
        }
        return en[C];
    }

    int ln(string s) {
        int C = 1;
        for(int i = 0; i < s.size(); i++) {
            if(tr[C][s[i]-'a'] == 0)
                return i;
            C = tr[C][s[i]-'a'];
            if(go[C] <= 0)
                return i;
        }
        return s.size();
    }

};

int T = 0;

int main() {

    int t;
    string S;
    trie T = *(new trie());

    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;
}