Cod sursa(job #1742194)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 15 august 2016 22:18:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>

#define NMax 35
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

class Trie{
public:
    int words;
    int prefixes;
    Trie *edge[26];

    Trie(){
        words = 0;
        prefixes = 0;
        memset(edge,0,sizeof(edge));
    }

    void addWord(Trie *node, char *w){
        if(*w == '\0'){
            node->words++;
            return;
        }
        if(node->edge[*w - 'a'] == 0){
            node->edge[*w - 'a'] = new Trie;
            node->prefixes++;
        }
        addWord(node->edge[*w - 'a'],w + 1);
    }

    int delWord(Trie *root, Trie *node, char *w){
        if(*w == '\0'){
            node->words--;
        }else
            if(delWord(root, node->edge[*w - 'a'],w + 1)){
                node->prefixes--;
                node->edge[*w - 'a'] = 0;
            }
        if(node->words == 0 && node->prefixes == 0 && node != root){
            delete node;
            return 1;
        }
        return 0;
    }

    int queWord(Trie *node, char *w){
        if(*w == '\0'){
            return node->words;
        }else{
            if(node->edge[*w - 'a'] == 0){
                return 0;
            }else
                return queWord(node->edge[*w - 'a'],w + 1);
        }
    }

    int preWord(Trie *node, char *w){
        if(*w == '\0' || node->edge[*w - 'a'] == 0)
            return 0;
        return 1 + preWord(node->edge[*w - 'a'], w + 1);
    }
};

Trie *root = new Trie;

int main()
{
    char line[NMax];
    while(f.getline(line,NMax)){
        if(line[0] == '0') root->addWord(root,line + 2);
        if(line[0] == '1') root->delWord(root,root,line + 2);
        if(line[0] == '2') g << root->queWord(root,line + 2) << '\n';
        if(line[0] == '3') g << root->preWord(root,line + 2) << '\n';
    }
    return 0;
}