Cod sursa(job #2820096)

Utilizator florinrafiliuRafiliu Florin florinrafiliu Data 19 decembrie 2021 21:29:25
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

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

const int INF = 1e9;

struct Trie {
    struct Node {
        Node *child[30];
        int cnt, endWord;
        Node() {
            for(int i = 0; i <= 26; ++i)
                child[i] = NULL;

            endWord = cnt = 0;
        }
    };
    Node *root;
    Trie () {
        root = new Node();
        root -> cnt = INF;
    }

    void Add(char *s) {
        int n = (int)strlen(s);
        Node *p = root;
        for(int i = 0; i < n; i++) {
            if(p -> child[s[i] - 'a'] == NULL) {
                p -> child[s[i] - 'a'] = new Node();
            }
            p = p -> child[s[i] - 'a'];
            p -> cnt++;
        }
        p -> endWord++;
    }

    void Erase(Node *p, char *s) {
        p -> cnt--;
        if(s[0] == '\0') {
            p -> endWord--;
            return;
        }
        Erase(p -> child[s[0] - 'a'], s + 1);
        if(p -> child[s[0] - 'a'] -> cnt == 0) {
            Node *temp = p -> child[s[0] - 'a'];
            delete temp;
            p -> child[s[0] - 'a'] = NULL;
        }
    }
    void Erase(char *s) {
        Erase(root, s);
    }

    int Count(char *s) {
        int n = (int)strlen(s);
        Node *p = root;
        for(int i = 0; i < n; ++i)
            if(p -> child[s[i] - 'a'] != NULL)
                p = p -> child[s[i] - 'a'];
            else return 0;
        return p -> endWord;
    }
    int maxP (char *s) {
        int n = (int)strlen(s);
        Node *p = root;
        for(int i = 0; i < n; ++i)
            if(p -> child[s[i] - 'a'] != NULL)
                p = p -> child[s[i] - 'a'];
            else
                return i;
        return n;
    }
};

int main()
{
    Trie a;
    int op;
    while (fin >> op) {
        char sir[25]; fin >> sir;
        if(op == 0) {
            a.Add(sir);
        } else if(op == 1) {
            a.Erase(sir);
        } else if(op == 2) {
            fout << a.Count(sir) << "\n";
        } else {
            fout << a.maxP(sir) << "\n";
        }
    }

    return 0;
}