Cod sursa(job #950917)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 18 mai 2013 18:41:48
Problema Trie Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <unordered_map>

using namespace std;

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

struct Trie{
    unordered_map<char,Trie*> links;
    int endWord=0;
    int words=0;
    void add(string x){
        words++;
        if(!x.size()){
            endWord++;
            return;
        }
        char letter=x[0];
        if(links.count(letter)==0){
            links[letter]=new Trie();
        }
        x.erase(x.begin());
        links[letter]->add(x);
    }
    void remove(string x){
        words--;
        if(words==0){
            links.clear();
        }
        if(!x.size()){
            endWord--;
            return;
        }
        char letter=x[0];
        if(links.count(letter)>0){
            x.erase(x.begin());
            links[letter]->remove(x);
            return;
        }
        return;
    }
    int hasWord(string x){
        if(!x.size()){
            return endWord;
        }
        char letter=x[0];
        if(links.count(letter)>0){
            x.erase(x.begin());
            return links[letter]->hasWord(x);
        }
        return false;
    }
    int prefix(string x){
        int result=0;
        return prefix(x,result);
    }
private:
    int prefix(string x,int result){
        if(!x.size() && words){
            return result;
        }
        if(!words){
            result--;
        }
        char letter=x[0];
        if(links.count(letter)>0){
            x.erase(x.begin());
            result++;
            return links[letter]->prefix(x,result);
        }
        return result;
    }
};

int main()
{
    Trie trie;
    int op;
    string word;
    while(in>>op){
        in>>word;
        if(op==0){
            trie.add(word);
        }
        if(op==1){
            trie.remove(word);
        }
        if(op==2){
            out<<trie.hasWord(word)<<"\n";
        }
        if(op==3){
            out<<trie.prefix(word)<<"\n";
        }
    }
    return 0;
}