Cod sursa(job #2417468)

Utilizator vladm98Munteanu Vlad vladm98 Data 29 aprilie 2019 22:11:45
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 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] = NULL;
    }
} *root;

void add(string s){
    Trie *current = root;
    current->cnt++;
    for(int i = 0; i < int(s.size()); ++i){
        int letter = s[i] - 'a';
        if(current->alfa[letter] == NULL)
            current->alfa[letter] = new Trie();
        current = current->alfa[letter];
        current->cnt++;
    }
}

void rem(string s){
    Trie *current = root;
    current->cnt--;
    for(int i = 0; i < int(s.size()); ++i){
        int letter = s[i] - 'a';
        current = current->alfa[letter];
        current->cnt--;
    }
}

int apar(string s){
    Trie *current = root;
    for(int i = 0; i < int(s.size()); ++i){
        int letter = s[i] - 'a';
        if(current->alfa[letter] == NULL)
            return 0;
        current = current->alfa[letter];
    }
    int inplus = 0;
    for(int i = 0; i < 26; ++i){
        if(current->alfa[i] == NULL)
            continue;
        inplus += current->alfa[i]->cnt;
    }
    int ans = current->cnt - inplus;
    return ans;
}

int pref(string s){
    Trie *current = root;
    int len = 0;
    for(int i = 0; i < int(s.size()); ++i){
        int letter = s[i] - 'a';
        if(current->alfa[letter] == NULL || 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;
}