Cod sursa(job #2986991)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 1 martie 2023 19:31:16
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>

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