Cod sursa(job #1365707)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 28 februarie 2015 14:35:29
Problema Trie Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

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

const int maxn = 25;
const int sigma = 26;

int n, m;
char s[maxn];

struct node {
    node *sons[sigma];
    int endings, fr;
    node () {
        endings = 0;
        fr = 0;
        memset(sons, 0, sizeof(sons));
    }
} *root;

inline void _insert(node *root, char *s) {
    if(!*s) {
        ++ root->endings;
        ++ root->fr;
        return;
    }
    ++ root->fr;
    int son = *s - 'a';
    if(!root->sons[son])
        root->sons[son] = new node();
    _insert(root->sons[son], s + 1);
}

inline void _erase(node *root, char *s) {
    if(!*s) {
        -- root->endings;
        -- root->fr;
        return ;
    }
    -- root->fr;
    _erase(root->sons[*s - 'a'], s + 1);
}

inline int _find(node *root, char *s) {
    if(root->fr == 0)
        return 0;
    if(!*s)
        return root->endings;
    if(!root->sons[*s - 'a'])
        return 0;
    return _find(root->sons[*s - 'a'], s + 1);
}

inline int _prefix(node *root, char *s) {
    if(root->sons[*s - 'a'] && root->sons[*s - 'a']->fr)
        return 1 + _prefix(root->sons[*s - 'a'], s + 1);
    return 0;
}

int main() {
    root = new node();
    int op;
    while(fin >> op >> s + 1) {
        if(op == 0)         _insert(root, s + 1);
        else if(op == 1)    _erase(root, s + 1);
        else if(op == 2)    fout << _find(root, s + 1) << '\n';
        else if(op == 3)    fout << _prefix(root, s + 1) << '\n';
    }
}