Cod sursa(job #2417477)

Utilizator vladm98Munteanu Vlad vladm98 Data 29 aprilie 2019 22:22:34
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

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

struct Trie{
    int cnt;
    Trie *alfa[26];
    Trie(){
        cnt = 0;
        for(int i = 0; i < 26; ++i)
            alfa[i] = nullptr;
    }
} *root;

void add(string &s){
    Trie *current = root;
    current->cnt++;
    for (char &i : s) {
        int letter = i - 'a';
        if(current->alfa[letter] == nullptr)
            current->alfa[letter] = new Trie();
        current = current->alfa[letter];
        current->cnt++;
    }
}

void rem(string &s){
    Trie *current = root;
    current->cnt--;
    for (char &i : s) {
        int letter = i - 'a';
        current = current->alfa[letter];
        current->cnt--;
    }
}

int apar(string &s){
    Trie *current = root;
    for (char &i : s) {
        int letter = i - 'a';
        if(current->alfa[letter] == nullptr)
            return 0;
        current = current->alfa[letter];
    }
    int inplus = 0;
    for (auto &i : current->alfa) {
        if(i == nullptr)
            continue;
        inplus += i->cnt;
    }
    int ans = current->cnt - inplus;
    return ans;
}

int pref(string &s){
    Trie *current = root;
    int len = 0;
    for (char &i : s) {
        int letter = i - 'a';
        if(current->alfa[letter] == nullptr || current->alfa[letter]->cnt == 0)
            return len;
        len++;
        current = current->alfa[letter];
    }
    return len;
}

int main()
{
    int com;
    string word;
    root = new Trie();
    while(fin >> com >> word){
        if(com == 0) add(word);
        if(com == 1) rem(word);
        if(com == 2) fout << apar(word) << "\n";
        if(com == 3) fout << pref(word) << "\n";
    }
    return 0;
}