Cod sursa(job #1521818)

Utilizator alexmisto342Turdean Alexandru alexmisto342 Data 10 noiembrie 2015 21:07:35
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
#define x first
#define y second
#define ch (*s-'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int c,n,m,i,j,ok,maxi=0,mini=2000000000,x,k,y,a,b,op;
char s[100];
struct Trie{
                Trie *fii[26];char cc;
                int nrfii,cuv;
                Trie()
                {
                    nrfii=0;cuv=0;
                    memset(fii,0,sizeof(fii));
                }

           } *t;

void ins(Trie *nod,char *s)
{

    if(nod->fii[ch]==0)
    {
        nod->nrfii++;
        nod->fii[ch]=new Trie;
        nod->fii[ch]->cc=*s;
    }
    if(!*(s+1))
    {
        nod->fii[ch]->cuv++;
    }
    else
        ins(nod->fii[ch],s+1);
}
int del(Trie *nod,char *s)
{
    if(*(s))
    {
        if(del(nod->fii[ch],s+1))
        {
            delete nod->fii[ch];
            nod->fii[ch]=0;
            nod->nrfii--;
            return nod->nrfii == 0 && nod->cuv == 0;
        }
        else
            return 0;
    }
    else
    {

        if(nod->cuv)
        {
            nod->cuv--;
            if(!nod->cuv&&!nod->nrfii)
            {
                return 1;
            }
            else
                return 0;
        }
    }

}
int q(Trie *nod,char *s)
{
    if(*(s))
        return q(nod->fii[ch],s+1);
    if(nod->fii[ch]!=0)
        return nod->cuv;
    return 0;
}
int pref(Trie *nod,char *s,int k)
{
    if(!*(s))
        return k;
    if(nod->fii[ch]!=0)
        return pref(nod->fii[ch],s+1,k+1);
    else
        return k;
}
int main()
{

    t=new Trie;
    while(fin>>op)
    {
        fin>>s;
        switch(op)
        {
            case 0: ins(t,s); break;
            case 1: del(t,s); break;
            case 2: fout<<q(t,s)<<'\n'; break;
            case 3: fout<<pref(t,s,0)<<'\n'; break;
        }
    }



return 0;
}