Cod sursa(job #3020937)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 17 martie 2023 11:00:36
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>

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

int main()
{
    while(f>>r>>s)
    {
        if(r==0)
            add(t,0,s);
        else
        if(r==1)
            deletee(t,0,s);
        else
        if(r==2)
            g<<apar(t,0,s)<<'\n';
        else
            g<<prefix(t,0,s)<<'\n';
    }
    return 0;
}