Cod sursa(job #3041693)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 1 aprilie 2023 10:20:15
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda tot_2 Marime 1.69 kb
#include <fstream>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int r;
struct trie
{
    int nr,val;
    trie *a[30];
    trie()
    {
        nr=val=0;
        for(int i=0;i<=27;i++)
            a[i]=0;
    }
};
void add(trie *nod,string s,int poz)
{
    if(poz==s.size())
    {
        nod->val++;
        return;
    }
    int fiu=s[poz]-'a';
    if(!nod->a[fiu])
    {
        nod->a[fiu]=new trie;
        nod->nr++;
    }
    add(nod->a[fiu],s,poz+1);
}
bool del(trie *nod,string s,int poz, trie *T)
{
    if(s.size()==poz)
    {
        nod->val--;
    }
    else
    {
        int fiu=s[poz]-'a';
        if(del(nod->a[fiu],s,poz+1,T))
        {
            nod->nr--;
            nod->a[fiu]=NULL;
        }
    }
    if(nod->nr==0&&nod->val==0)
    {
        delete nod;
        return true;
    }
    return 0;
}
void apar(trie *nod,string s,int poz)
{
    if(s.size()==poz)
    {
        g<<nod->val<<'\n';
        return;
    }
    int fiu=s[poz]-'a';
    if(!nod->a[fiu])
    {
        g<<0<<'\n';
        return;
    }
    apar(nod->a[fiu],s,poz+1);
}
void pref(trie *nod,string s,int poz)
{
    if(s.size()==poz)
    {
        g<<s.size()<<'\n';
        return;
    }
    int fiu=s[poz]-'a';
    if(nod->a[fiu]==NULL)
    {
        g<<poz<<'\n';
        return;
    }
    pref(nod->a[fiu],s,poz+1);
}
int main()
{
    string s;
    trie *T=new trie;
    while(f>>r>>s)
    {
        if(r==0)
            add(T,s,0);
        else
        if(r==1)
            del(T,s,0,T);
        else
        if(r==2)
            apar(T,s,0);
        else
            pref(T,s,0);
    }
    return 0;
}