Cod sursa(job #2020575)

Utilizator tavonSuleyman Magnificul tavon Data 10 septembrie 2017 20:30:55
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<bits/stdc++.h>
using namespace std;

struct Node {
    int many, subMany;
    char value;
    unordered_map<char, Node*> next;
    Node(char _value): value(_value) {
        many = subMany = 0;
    }
};

Node* root;

void addPath(string &w) {
    Node *current = root;
    for(auto it : w) {
        current->subMany++;
        if(!current->next[it]) {
            current->next[it] = new Node(it);
        }
        current = current->next[it];
    }
    current->many++;
    current->subMany++;
}

void deletePath(string &w) {
    Node *current = root;
    for(auto it : w) {
        current->subMany--;
        current = current->next[it];
    }
    current->many--;
    current->subMany--;
}

int apparitions(string &w) {
    Node *current = root;
    for(auto it : w) {
        if(!current->next[it]) {
            return 0;
        }
        current = current->next[it];
    }
    return current->many;
}

int longestPath(string &w) {
    Node *current = root;
    int length = 0;
    for(auto it : w) {
        if(!current->next[it]) {
            return length;
        }
        current = current->next[it];
        if(!current->subMany) {
            return length;
        }
        length++;
    }
    return length;
}

int main() {
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    int type;
    string w;

    root = new Node('$');

    while(cin >> type >> w) {
        switch(type) {
        case 0:
            addPath(w);
            break;
        case 1:
            deletePath(w);
            break;
        case 2:
            cout<<apparitions(w)<<'\n';
            break;
        case 3:
            cout<<longestPath(w)<<'\n';
            break;
        }
    }

    return 0;
}