Cod sursa(job #2725874)

Utilizator matthriscuMatt . matthriscu Data 19 martie 2021 19:35:28
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

struct Trie {
    int final, n;
    Trie* v[26];

    Trie() {
        final = 0;
        n = 0;
        for(int i = 0; i < 26; ++i)
            v[i] = NULL;
    }
};
Trie *root = new Trie(), *current = new Trie();

void add(char* s) {
    int l = strlen(s);
    current = root;
    for(int i = 0; i < l; ++i) {
        if(current -> v[s[i] - 'a'] == NULL) {
            current -> v[s[i] - 'a'] = new Trie();
            ++current -> n;
        }
        current = current -> v[s[i] - 'a'];
    }
    ++current -> final;
}

bool remove(Trie* current, char* s) {
    if(s[0] == '\0')
        --current -> final;
    else if(remove(current -> v[s[0] - 'a'], s+1)) {
        --current -> n;
        current -> v[s[0] - 'a'] = NULL;
    }
    if(current -> final == 0 && current -> n == 0 && current != root) {
        delete current;
        return 1;
    }
    return 0;
}

int count(char* s) {
    current = root;
    int l = strlen(s);
    for(int i = 0; i < l; ++i)
        if(current -> v[s[i] - 'a'])
            current = current -> v[s[i] - 'a'];
        else
            return 0;
    return current -> final;
}

int prefix(char* s) {
    int i = 0, l = strlen(s);
    current = root;
    while(current -> v[s[i] - 'a'] != NULL && i < l) {
        current = current -> v[s[i] - 'a'];
        ++i;
    }
    return i;
}

int main() {
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    int op;
    char s[21];
    while(fin >> op >> s) {
        switch(op) {
            case 0:
                add(s);
                break;
            case 1:
                remove(root, s);
                break;
            case 2:
                fout << count(s) << '\n';
                break;
            case 3:
                fout << prefix(s) << '\n';
                break;
        }
    }
}