Cod sursa(job #2665637)

Utilizator Savu_Stefan_CatalinSavu Stefan Catalin Savu_Stefan_Catalin Data 31 octombrie 2020 10:28:21
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct nod
{
    int ap;
    int nr;
    nod *next[26];
    nod ()
    {
        ap=nr=0;
        for (int i=0;i<26;++i)
            next[i]=nullptr;
    }
};
nod *tre;
char s[30];
int cer;
static inline void update(nod *tre,char *word,int val,int rem)
{
    if (rem==0)
    {
        tre->ap+=val;
        return ;
    }
    int now=(int)(*word-'a');
    if (tre->next[now]==nullptr)
    {tre->next[now]=new nod; tre->nr++;}
    update(tre->next[now],word+1,val,rem-1);
    if (val==-1)
    {
        nod *son=tre->next[now];
            if (son->ap==0&&son->nr==0)
            {delete(son); tre->next[now]=nullptr; tre->nr--;}
    }
    return ;
}
static inline int query1(nod *tre,char *word,int rem)
{
    if (rem==0)
        return tre->ap;
    int now=(int)(*word-'a');
    if (tre->next[now]==nullptr)
        return 0;
    return query1(tre->next[now],word+1,rem-1);
}
static inline int query2(nod *tre,char *word,int rem,int lvl)
{
    if (rem==0)
        return lvl;
    int now=(int)(*word-'a');
    if (tre->next[now]==nullptr)
        return lvl;
    return query2(tre->next[now],word+1,rem-1,lvl+1);
}
int main()
{
    ios_base::sync_with_stdio(NULL);
    in.tie();
    out.tie();
    tre=new nod;
    while (in>>cer>>(s+1))
    {
        if (cer==0)
            update(tre,s+1,1,(int)strlen(s+1));
        if (cer==1)
            update(tre,s+1,-1,(int)strlen(s+1));
        if (cer==2)
            out<<query1(tre,s+1,(int)strlen(s+1))<<'\n';
        if (cer==3)
            out<<query2(tre,s+1,(int)strlen(s+1),0)<<'\n';
    }
    return 0;
}