Cod sursa(job #2585947)

Utilizator marius004scarlat marius marius004 Data 19 martie 2020 15:44:22
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <fstream>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

const int CHAR = 26;

class Trie{
    
public:
    
    Trie *characters[CHAR];
    int aparitie_cuvant;
    int aparitie_litera;
    
    Trie(){
        aparitie_litera = aparitie_cuvant = 0;
        
        for(int i = 0;i < CHAR;++i)
            this->characters[i] = nullptr;
    }
    
    void insert(const string& key){
        
        Trie *iterator = this;
        
        for(int i = 0;i < key.size();++i){
            
            if(iterator->characters[ key[i] - 'a' ] == nullptr)
                iterator->characters[ key[i] - 'a' ] = new Trie();
            
            iterator->characters[ key[i] - 'a']->aparitie_litera++;
            iterator = iterator->characters[ key[i] - 'a'];
        }
        
        iterator->aparitie_cuvant++;
    }
    
    void deleteStr(const string& key){
        
        Trie *iterator = this;
        
        for(int i = 0;i < key.size();++i){
            iterator->characters[ key[i] - 'a']->aparitie_litera--;
            iterator = iterator->characters[ key[i] - 'a' ];
        }
        
        iterator->aparitie_cuvant--;
    }
    
    int aparitii(const string& key){
        
        Trie *iterator = this;
        
        for(int i = 0;i < key.size();++i){
            
            if(iterator->characters[ key[i] - 'a'] == nullptr)
                return 0;
            
            iterator = iterator->characters[ key[i] - 'a' ];
        }
        
        return iterator->aparitie_cuvant;
    }
    
    int prefix(const string&key){
        
        Trie *iterator = this;
        int cnt = 0;
        
        for(int i = 0;i < key.size();++i){
            
            if(iterator->characters[ key[i] - 'a' ] != nullptr && iterator->characters[ key[i] - 'a' ]->aparitie_litera >= 1)
                cnt++;
            else
                return cnt;
            
            iterator = iterator->characters[ key[i] - 'a' ];
        }
        
        return cnt;
    }
};

int nr;
string s;

int main(){
    
    Trie *root = new Trie();
    
    while(f >> nr >> s){
        
        if(nr == 0)
            root->insert(s);
        else if(nr == 1)
            root->deleteStr(s);
        else if(nr == 2)
            g << root->aparitii(s) << '\n';
        else if(nr == 3)
            g << root->prefix(s) << '\n';
    }
    
    return 0;
}