Mai intai trebuie sa te autentifici.

Cod sursa(job #1741960)

Utilizator KonoplyankaKonoplyanka Konoplyanka Data 15 august 2016 15:45:08
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <cstring>
#define q (*c-'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int tip;
char cuv[30];
struct Trie
{
    int nrc,nr_;
    Trie *S[26];
    Trie()
    {
        nrc=nr_=0;
        memset(S,0,sizeof S);
    }
};
Trie *T=new Trie;
inline bool ok(char x)
{
    return x<'a'||x>'z';
}
inline void ins(Trie *nod,char *c)
{
    if(ok(*c))
    {
        nod->nrc++;
        return;
    }
    if(!nod->S[q])
    {
        nod->S[q]=new Trie;
        nod->nr_++;
    }
    ins(nod->S[q],c+1);
}
inline bool del(Trie *nod,char *c)
{
    if(ok(*c)) nod->nrc--;
    else if(del(nod->S[q],c+1))
    {
        nod->nr_--;
        nod->S[q]=0;
    }
    if(!nod->nrc&&!nod->nr_&&nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
inline int ans(Trie *nod,char *c)
{
    if(ok(*c)) return nod->nrc;
    if(nod->S[q]) return ans(nod->S[q],c+1);
    return 0;
}
inline int pref(Trie *nod,char *c,int k)
{
    if(ok(*c)||!nod->S[q]) return k;
    return pref(nod->S[q],c+1,k+1);
}
int main()
{
    while(f>>tip>>cuv)
    {
        if(tip==0) ins(T,cuv);
        else if(tip==1) del(T,cuv);
        else if(tip==2) g<<ans(T,cuv)<<'\n';
        else g<<pref(T,cuv,0)<<'\n';
    }
    return 0;
}