Cod sursa(job #2583134)

Utilizator marius004scarlat marius marius004 Data 17 martie 2020 19:47:37
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.11 kb
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

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

const int LITERE = 26;

class Trie{
    
public:
    
    Trie *characters[LITERE];
    bool isLeaf;
    int aparitie_cuvant;//de cate ori apare un cuvant
    int aparitie_litera;// de cate ori apare o litera
    
    Trie(){
        
        aparitie_litera = 0;
        aparitie_cuvant = 0;
        isLeaf = false;
        
        for(int i = 0;i < LITERE;++i)
            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->isLeaf = true;
        iterator->aparitie_cuvant++;
    }
    
    int numar_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_comun(const string& key){
        
        Trie *iterator = this;
        int sol = 0;
        
        for(int i = 0;i < key.size();++i){
            
            if(iterator->characters[ key[i] - 'a' ] != nullptr)
                sol++;
            else
                return sol;
            
            iterator = iterator->characters[key[i] - 'a'];
        }
        
        return sol;
    }
    
    bool haveChildren(const Trie * iterator){
        
        for(int i = 0;i < LITERE;++i)
            if(iterator->characters[i] != nullptr)
                return true;
        
        return false;
    }
    
    void deleteString(string key){
        
        Trie *iterator = this;
        
        for(int i = 0;i < key.size();++i){
            
            if(iterator->characters[ key[i] - 'a'] == nullptr)
                return;
            
            iterator->characters[ key[i] - 'a' ]->aparitie_litera--;
            iterator->characters[ key[i] - 'a' ]->aparitie_litera = max(0,iterator->characters[ key[i] - 'a' ]->aparitie_litera);
            iterator = iterator->characters[ key[i] - 'a' ];
        }
        
        iterator->aparitie_cuvant--;
        iterator->aparitie_cuvant = max(iterator->aparitie_cuvant,0);
        
        if(iterator->aparitie_cuvant == 0)
            iterator->isLeaf = false;
    }
     
};

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->deleteString(s);
        else if(nr == 2)
           g << root->numar_aparitii(s) << '\n';
        else if(nr == 3)
           g << root->prefix_comun(s) << '\n';
    }
    
    return 0;
}