Cod sursa(job #2633755)

Utilizator BogdanGhGhinea Bogdan BogdanGh Data 8 iulie 2020 14:30:38
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");
int x,i,ok;
string s;
struct trie{
int nr;
map <char,trie*>m;
trie ()
{
    //m.clear();
    nr=0;
}
};
void adauga(trie *nod)
{
    for(i=0;i<s.size();i++)
    {
        if(nod->m[s[i]]==nullptr){
            trie *p=new trie;
            nod->m[s[i]]=p;
            nod=p;
        }
        else nod=nod->m[s[i]];
    }
    nod->nr++;
}
void sterge(trie *nod)
{
    if(i==s.size())
    {
        nod->nr--;
        if(nod->nr==0)ok=1;
    }
    else {

        i++;
        sterge(nod->m[s[i-1]]);
        i--;
        trie *fiu=nod->m[s[i]];
        if(ok&&fiu->m.size()==0&&fiu->nr==0)
            nod->m.erase(s[i]);

    }

}
int querry1(trie *nod)
{
    for(i=0;i<s.size();i++)
        if(nod->m[s[i]]==nullptr)
        {
            nod->m.erase(s[i]);
            return 0;
        }
        else
        nod=nod->m[s[i]];
    return nod->nr;
}
int querry2(int i,trie *nod)
{
    //if(nod->nr>0)return 0;
    if(nod->m[s[i]]!=NULL)
        return 1+querry2(i+1,nod->m[s[i]]);
    else {
            nod->m.erase(s[i]);
            return 0;
    }
}
int main()
{
    trie *T=new trie;
    while(f>>x>>s)
    {
        i=ok=0;
        if(x==0)adauga(T);
        else
        if(x==1)sterge(T);
        else
        if(x==2)g<<querry1(T)<<'\n';
        else
        if(x==3)g<<querry2(0,T)<<'\n';
    }
    return 0;
}