Cod sursa(job #2833766)

Utilizator bostanlucastefanBostan Luca-Stefan bostanlucastefan Data 15 ianuarie 2022 17:32:23
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie{
    int n,c;
    trie *p[27];

    trie(){
        n=c=0;
        memset(p,0,sizeof(p));
    }
};

trie *t=new trie;
char s[21];
int op;

void op0(trie *nod,char *s)
{
    if(!isalpha(*s))
    {
        nod->n++;
        return;
    }

    int nxt=*s-'a';
    if(!nod->p[nxt])
        nod->c++, nod->p[nxt]=new trie;
    op0(nod->p[nxt],s+1);
}

bool op1(trie *nod,char *s)
{
    if(!isalpha(*s))
        nod->n--;
    else if(op1(nod->p[*s-'a'],s+1))
    {
        nod->c--;
        nod->p[*s-'a']=0;
    }
    if(nod->n==0 && nod->c==0 && nod!=t)
    {
        delete nod;
        return true;
    }
    return false;
}

int op2(trie *nod,char *s)
{
    if(!isalpha(*s))
        return nod->n;
    if(nod->p[*s-'a'])
        return op2(nod->p[*s-'a'],s+1);
    return 0;
}

int op3(trie *nod,char *s,int lg)
{
    if(!isalpha(*s) || nod->p[*s-'a']==0)
        return lg;
    return op3(nod->p[*s-'a'],s+1,lg+1);
}

int main()
{
    while(fin>>op>>s)
    {
        switch(op)
        {
            case 0: op0(t,s); break;
            case 1: op1(t,s); break;
            case 2: fout<<op2(t,s)<<'\n'; break;
            case 3: fout<<op3(t,s,0)<<'\n'; break;
        }
    }
    return 0;
}