Cod sursa(job #2665645)

Utilizator PredescuSebastianIonPredescu Sebastian Ion PredescuSebastianIon Data 31 octombrie 2020 10:35:11
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
    int ap,nr;
    nod *urm[26];
    nod ()
    {
        ap=nr=0;
        for(int i=0; i<26; ++i)
            urm[i]=nullptr;
    }
};
nod *tre;
char s[30];
int cerinta;
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->urm[now]==nullptr)
    {
        tre->urm[now]=new nod;
        tre->nr++;
    }
    update(tre->urm[now],word+1,val,rem-1);
    if (val==-1)
    {
        nod *son=tre->urm[now];
        if(son->ap==0 && son->nr==0)
        {
            delete(son);
            tre->urm[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->urm[now]==nullptr)return 0;
    return query1(tre->urm[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->urm[now]==nullptr)return lvl;
    return query2(tre->urm[now],word+1,rem-1,lvl+1);
}
int main()
{
    ios_base::sync_with_stdio(NULL);
    f.tie();
    g.tie();
    tre=new nod;
    while(f>>cerinta>>(s+1))
    {
        if(cerinta==0)update(tre,s+1,1,(int)strlen(s+1));
        if(cerinta==1)update(tre,s+1,-1,(int)strlen(s+1));
        if(cerinta==2)g<<query1(tre,s+1,(int)strlen(s+1))<<'\n';
        if(cerinta==3)g<<query2(tre,s+1,(int)strlen(s+1),0)<<'\n';
    }
    return 0;
}