Cod sursa(job #2397832)

Utilizator CezarTDTodirisca Cezar CezarTD Data 4 aprilie 2019 19:57:54
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
inline int nr(char ch)
{
    return int(ch-'a');
}
struct Trie
{
    int cuv;
    int cnt;
    Trie *fii[26];
    Trie()
    {
        cnt=0;
        cuv=0;
        for(int i=0;i<26;i++)
            fii[i]=NULL;
    }
};

Trie *T = new Trie;

pair< Trie* , int > st[100010];

char w[25];
int op;

int main()
{
    while(f>>op)
    {
        f>>w;
        if(op==0)
        {
            char *p;
            Trie *r;
            for(p=w,r=T;p;p++)
            {
                int i=nr(*p);
                r->cuv++;
                if(!r->fii[i])r->fii[i]=new Trie;
                r=r->fii[i];
            }
            r->cnt++;
            r->cuv++;
        }
        if(op==1)
        {
            int i,k=0;
            char *p;
            Trie *r;
            for(p=w,r=T;p;p++)
            {
                i=nr(*p);
                r->cuv--;
                st[++k]=make_pair(r,i);
                r=r->fii[i];
            }
            r->cnt--;
            r->cuv--;
            for(k--;k>=1;k--)
            {
                Trie *rfiu;
                tie(r,i)=st[k];
                rfiu=r->fii[i];
                if(rfiu->cuv==0)
                {
                    r->fii[i]=NULL;
                    delete(rfiu);
                }
            }
        }
        if(op==2)
        {
            char *p;
            Trie *r;
            int i;
            for(p=w,r=T;p;p++)
            {
                i=nr(*p);
                if(!r->fii[i])break;
            }
            if(*p)g<<"0\n";
            else g<<(r->cuv)<<'\n';
        }
        if(op==3)
        {
            int i,prefix=0;
            char *p;
            Trie *r;
            for(p=w,r=T;p;p++)
            {
                i=nr(*p);
                if(!r->fii[i])break;
                prefix++;
            }
            g<<prefix<<'\n';
        }
    }
    return 0;
}