Cod sursa(job #1937762)

Utilizator GinguIonutGinguIonut GinguIonut Data 24 martie 2017 11:23:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <string.h>


#define CH *ch-'a'

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

char sir[30];

struct Trie
{
    int cnt, nrfii;
    Trie *fii[26];
    Trie()
    {
        cnt=nrfii=0;
        memset(fii, 0, sizeof(fii));
    }
};
Trie *T=new Trie;

void insertTrie(Trie *node, char *ch)
{
    if(*ch<'a' || *ch>'z')
    {
        node->cnt++;
        return;
    }
    if(node->fii[CH]==0)
    {
        node->fii[CH]=new Trie;
        node->nrfii++;
    }
    insertTrie(node->fii[CH], ch+1);
}

bool eraseTrie(Trie *node, char *ch)
{
    if(*ch<'a' || *ch>'z')
        node->cnt--;
    else
    {
        if(eraseTrie(node->fii[CH], ch+1))
        {
            node->nrfii--;
            node->fii[CH]=NULL;
        }
    }

    if(node!=T && node->nrfii==0 && node->cnt==0)
    {
        delete node;
        return 1;
    }
    return 0;
}

int queryTrie(Trie *node, char *ch)
{
    if(*ch<'a' || *ch>'z')
        return node->cnt;
    if(node->fii[CH]==0)
        return 0;
    return queryTrie(node->fii[CH], ch+1);
}

int prefixTrie(Trie *node, char *ch, int k)
{
    if(*ch<'a' || *ch>'z')
        return k;
    if(node->fii[CH]==0)
        return k;
    return prefixTrie(node->fii[CH], ch+1, k+1);
}

int main()
{
    while(fin.getline(sir, 25))
    {
        switch(sir[0])
        {
            case '0': insertTrie(T, sir+2); break;
            case '1': eraseTrie(T, sir+2); break;
            case '2': fout<<queryTrie(T, sir+2)<<'\n'; break;
            case '3': fout<<prefixTrie(T, sir+2, 0)<<'\n'; break;
        }
    }
}