Cod sursa(job #2857175)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 25 februarie 2022 08:32:11
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
    int val,nrf;
    trie *fiu[27];
    trie()
    {
        val=nrf=0;
        memset(fiu,0,sizeof(fiu));
    }
};
trie *t=new trie;
void update(trie *x,char c[],int k)
{
    if(k==strlen(c))
    {
        x->val++;
        return;
    }
    char ch=c[k]-'a';
    if(x->fiu[ch]==0)
    {
        x->fiu[ch]=new trie;
        x->nrf++;
    }
    update(x->fiu[ch],c,k+1);
}
bool delte(trie *x,char c[],int k)
{
    char ch=c[k]-'a';
    if(k==strlen(c))
        x->val--;
    else
    if(delte(x->fiu[ch],c,k+1)==1)
    {
        x->fiu[ch]=0;
        x->nrf--;
    }
    if(x->val==0 && x->nrf==0 && x!=t)
    {
        delete x;
        return 1;
    }
    return 0;
}
int howmany(trie *x,char c[],int k)
{
    if(k==strlen(c))
        return x->val;
    char ch=c[k]-'a';
    if(x->fiu[ch]==0)
        return 0;
    return howmany(x->fiu[ch],c,k+1);
}
int prefix(trie *x,char c[],int k)
{
    char ch=c[k]-'a';
    if(k==strlen(c) || x->fiu[ch]==0)
        return k;
    return prefix(x->fiu[ch],c,k+1);
}
int x;
char c[30];
int main()
{
    while(f>>x)
    {
        f>>c;
        if(x==0)
            update(t,c,0);
        if(x==1)
            delte(t,c,0);
        if(x==2)
            g<<howmany(t,c,0)<<'\n';
        if(x==3)
            g<<prefix(t,c,0)<<'\n';
    }
    return 0;
}