Cod sursa(job #963460)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 17 iunie 2013 15:49:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <cstring>
 
using namespace std;
 
ifstream in ("trie.in");
ofstream out ("trie.out");
 
struct trie
{
    int ap, nrfii;
    trie *next[27];
 
    trie ()
    {
        memset (next, 0, sizeof (next));
        ap = nrfii = 0;
    }
};
 
trie *root = new trie;
 
void insert (char *S)
{
    int now;
    trie *T = root;
 
    while (*S){
        now = *S - 'a';
        if (T -> next[now] == NULL)
            T -> next[now] = new trie, T -> nrfii ++;
 
        T = T -> next[now];
        ++ S;
    }
 
    T -> ap ++;
}
 
int aparitii (char *S)
{
    int now;
    trie *T = root;
 
    while (*S){
        now = *S - 'a';
 
        if (T -> next[now] == NULL)
            return 0;
 
        T = T -> next[now];
        ++ S;
    }
 
    return T -> ap;
}
 
bool erase (trie *T, char *S)
{
    if (*S == 0)
        T -> ap --;
    else
        if (erase (T -> next[*S - 'a'], S + 1))
            T -> next[*S - 'a'] = 0, T -> nrfii --;
 
    if (T -> ap == 0 && T -> nrfii == 0 && T != root){
        delete T;
        return 1;
    }
 
    return 0;
}
 
int prefix (trie *T, char *S, int p)
{
    if (*S == 0 || T -> next[*S - 'a'] == NULL)
        return p;
 
    return prefix (T -> next[*S - 'a'], S + 1, p + 1);
}
 
int main()
{
    char S[30];
    int op;
 
    while (in >> op >> S){
        if (op == 0)
            insert (S);
 
        if (op == 1)
            erase (root, S);
 
        if (op == 2)
            out << aparitii (S) << "\n";
 
        if (op == 3)
            out << prefix (root, S, 0) << "\n";
    }
 
    return 0;
}