Cod sursa(job #1742181)

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

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

struct Trie{
    int words;
    int prefixes;
    Trie *edge[26];

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

Trie *root = new Trie;

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 *node, char *w){
    if(*w == '\0'){
        node->words--;
    }else
        if(delWord(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);
}
int main()
{
    char line[NMax];
    while(f.getline(line,NMax)){
        if(line[0] == '0') addWord(root,line + 2);
        if(line[0] == '1') delWord(root,line + 2);
        if(line[0] == '2') g << queWord(root,line + 2) << '\n';
        if(line[0] == '3') g << preWord(root,line + 2) << '\n';
    }
    return 0;
}