Cod sursa(job #2203649)

Utilizator Menage_a_011UPB Cheseli Neatu Popescu Menage_a_011 Data 12 mai 2018 20:18:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.01 kb
// https://goo.gl/fBmFxu
#include <bits/stdc++.h>
using namespace std;

#define NMAX        100009
#define MMAX        200009
#define kInf        (1 << 30)
#define kInfLL      (1LL << 60)
#define kMod        666013
#define edge pair<int, int>
#define x first
#define y second

#define USE_FILES "MLC"

#ifdef USE_FILES
#define cin fin
#define cout fout
ifstream fin("trie.in");
ofstream fout("trie.out");
#endif

// number of tests from "in"
int test_cnt = 1;
void clean_test();

// your global variables are here
#define CH(c)(c - 'a')

struct Trie {
    static const int ALPHA = 26;

    Trie *son[ALPHA];
    int areHere, endsHere;



    Trie() {
        areHere = endsHere = 0;
        memset(son, 0, sizeof(son));
    }

    ~Trie() {
        for (int i = 0; i < ALPHA; ++i) {
            if (son[i] != NULL) {
                delete son[i];
            }
        }
    }

    void insert(char *s) {
        Trie *node = this;

        ++node-> areHere;
        for (int i = 0; s[i]; ++i) {
            int x = s[i] - 'a';

            if (!node->son[x]) {
                node->son[x] = new Trie();
            }

            node = node->son[x];
            ++node->areHere;
          }

         ++node->endsHere;
    }

    void remove(char *s) {
        Trie *node = this;

        --node->areHere;

        for (int i = 0; s[i]; ++i) {
            int x = s[i] - 'a' ;
            if (!node->son[x]) {
                return;
            }
            node = node->son[x];
            --node->areHere;
        }

        --node->endsHere;
        if (node->endsHere < 0 )
            node -> endsHere = 0;
    }

    int search(char *s) {
        Trie *node = this;

        for (int i = 0; s[i]; ++i) {
            int x = s[i] - 'a' ;
            if (!node->son[x]) {
                return 0;
            }
            node =node->son[x];
        }

        return node->endsHere;
    }

    int lcp(char *s) {
        Trie *node = this;

        int i;
        for (i = 0; s[i]; ++i) {
            int x = s[i] - 'a' ;
            if (!node->son[x] ) {
                return i;
            }
            node = node->son[x];
            if (!node->areHere) {
                return i;
            }
        }
        return i;
    }

 };


// your solution is here
void solve() {
    Trie *T =  new Trie();

    int op;
    string word;
    int result;

    while (cin >> op) {
        cin >> word;
        char *s = (char * )word.c_str();
        switch(op) {
            case 0:
                T->insert(s);
                break;
            case 1:
                T->remove(s);
                break;
            case 2:
                cout << T->search(s) << '\n';
                break;
            case 3:
                cout << T->lcp(s) << '\n';
                break;
            default:
                break;
        }
    }
    delete T;


    if (test_cnt > 0) {
        clean_test();
    }
}


void clean_test() {
    // clean if needed
}

int main() {
//     cin >> test_cnt;
    while (test_cnt--) {
        solve();
    }

    return 0;
}