Cod sursa(job #2668140)

Utilizator H7GhosTsdfgsd asdf H7GhosT Data 4 noiembrie 2020 15:48:23
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>
using namespace std;

class Node {
    public:
        Node *childs[int('z' - 'a' + 1)];
        int wcnt;//word
        int pcnt;//pref

        Node() {
            memset(this, 0, sizeof(Node));
        }
} *root = new Node;

void add(const char * word) {
    Node* node = root;
    while (*word) {
        if (node->childs[(*word) - 'a']) {
            node = node->childs[(*word) - 'a'];
        } else {
            node = (node->childs[(*word) - 'a'] = new Node);
        }
        node->pcnt++;
        word++;
    }
    node->wcnt++;
}

void del(const char * word) {
    Node* node = root;
    while (*word) {
        node = node->childs[(*word) - 'a'];
        word++;
        node->pcnt--;
    }
    node->wcnt--;
}

int acc(const char * word) {
    Node* node = root;
    while (*word) {
        if (node->childs[(*word) - 'a']) {
            node = node->childs[(*word) - 'a'];
        } else return 0;
        word++;
    }
    return node->wcnt;
}

int len(const char * word) {
    Node* node = root;
    int cnt = 0;
    while (*word) {
        if (node->childs[(*word) - 'a']) {
            node = node->childs[(*word) - 'a'];
            if (!(node->pcnt)) break;
            cnt++;
        } else break;
        word++;
    }
    return cnt;
}
int main() {
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);

    int op;
    char word[21];
    while(scanf("%d %21s", &op, word) != EOF) {
        switch (op) {
            case 0:
                add(word); break;
            case 1:
                del(word); break;
            case 2:
                printf("%d\n", acc(word)); break;
            case 3:
                printf("%d\n", len(word)); break;
            default: break;
        };
    }
}