Cod sursa(job #2416378)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 27 aprilie 2019 14:40:12
Problema Trie Scor 80
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[30];
    Trie(){
        cnt = 0;
        for(int i = 0; i < 26; ++i)
            alfa[i] = NULL;
    }
} *root;

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

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

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

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

int main()
{
    int p;
    string s;
    root = new Trie();
    while(fin >> p >> s){
        if(p == 0) adaug(s);
        if(p == 1) sterg(s);
        if(p == 2) fout << apar(s) << "\n";
        if(p == 3) fout << pref(s) << "\n";
    }
    return 0;
}