Cod sursa(job #1918627)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 9 martie 2017 16:16:11
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct nod
{
    int ap;
    nod *F[27];
    nod()
    {
        ap=0;
        for(int i=1; i<=26; i++)
            F[i]=0;
    }
};
nod *root,*q,*aux,*aux2;

bool cond(nod *parametru,int lit)
{
    for(int i=1; i<=26; i++)
    {
        if((parametru->F[i])&&(i!=lit))
            return true;
    }
    return false;
}

int main()
{
    int op;
    char cuv[30];
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    root =new nod;
    int i;
    int lg,l;
    for(; scanf("%d %s\n",&op,cuv+1)+1;)
    {
        lg=strlen(cuv+1);
        if(op!=3)
        {

            for(i=1,q=root; i<=lg; i++)
            {
                if(!(q->F[*(cuv+i)-'a'+1]))
                {
                    aux=new nod;
                    aux->ap=0;
                    q->F[*(cuv+i)-'a'+1]=aux;
                }
                aux2=q;
                q=q->F[*(cuv+i)-'a'+1];
                //cout<<*(cuv+i)<<" ";
            }
            //cout<<endl;
            if(op==0)
                q->ap+=1;

            if(op==1)
            {
                q->ap-=1;
                if(q->ap==0&&!cond(q,0))
                {
                    aux2->F[*(cuv+lg)-'a'+1]=NULL;
                    delete q;
                }
            }

            if(op==2)
            {
                if(q->ap<0)
                    printf("0\n");
                else
                    printf("%d\n",q->ap);
            }
        }
        else
        {
            q=root;
            l=1;
            while(l<=lg&&q->F[(*(cuv+l)-'a')+1])
            {
                //cout<<*(cuv+l)<<" ";
                q=q->F[(*(cuv+l)-'a')+1];
                l++;
            }
            printf("%d\n",l-1);
        }
    }
    return 0;
}