Cod sursa(job #2198573)

Utilizator PredaBossPreda Andrei PredaBoss Data 24 aprilie 2018 18:35:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>

using namespace std;
int c;
string cuv;
char aux[25];
struct nod
{
    int counter,howmany;
    nod *son[26];
    nod()
    {
        counter=0;
        howmany=0;
        memset(son,0,sizeof(son));
    }
};
nod *jmek=new nod;
void add(nod *parent,int pos)
{
    if(pos==cuv.size())
    {
        parent->counter++;
        return;
    }
    if(parent->son[cuv[pos]-'a']==0)
    {
        parent->son[cuv[pos]-'a']=new nod;
        parent->howmany++;
    }
    add(parent->son[cuv[pos]-'a'],pos+1);
}
bool pop(nod *parent,int pos)
{
    if(pos==cuv.size())
        parent->counter--;
    else
    {
        if(pop(parent->son[cuv[pos]-'a'],pos+1))
        {
            parent->son[cuv[pos]-'a']=0;
            parent->howmany--;
        }
    }
    if(parent->counter==0 && parent->howmany==0 && parent!=jmek)
    {
        delete parent;
        return 1;
    }
    return 0;
}
int count_them(nod *parent,int pos)
{
    if(pos==cuv.size())
        return parent->counter;
    if(parent->son[cuv[pos]-'a']==0)
        return 0;
    return count_them(parent->son[cuv[pos]-'a'],pos+1);
}
int largest_prefix(nod *parent,int pos)
{
    if(pos==cuv.size())
        return pos;
    if(parent->son[cuv[pos]-'a']==0)
        return pos;
    return largest_prefix(parent->son[cuv[pos]-'a'],pos+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while(!feof(stdin))
    {
        scanf("%d %s\n",&c,aux);
        cuv=string(aux);
        if(c==0)
        {
            add(jmek,0);
            continue;
        }
        if(c==1)
        {
            pop(jmek,0);
            continue;
        }
        if(c==2)
        {
            printf("%d\n",count_them(jmek,0));
            continue;
        }
        printf("%d\n",largest_prefix(jmek,0));
    }
    return 0;
}