Cod sursa(job #2949267)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 30 noiembrie 2022 12:34:01
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>

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