Cod sursa(job #2414681)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 24 aprilie 2019 21:36:23
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
// nu e sursa mea


#include <bits/stdc++.h>

using namespace std;
int c;
string cuv;
ifstream in ("trie.in") ;
ofstream out ("trie.out") ;
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()
{

    while(in >> c >> cuv )
    {
        if(c==0)
        {
            add(jmek,0);
            continue;
        }
        if(c==1)
        {
            pop(jmek,0);
            continue;
        }
        if(c==2)
        {
            out << count_them(jmek,0) << '\n' ;
            continue;
        }
       out << largest_prefix(jmek,0) << '\n' ;
    }
    return 0;
}