Cod sursa(job #834202)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 13 decembrie 2012 22:16:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<fstream>
#include<string.h>
#define set0 for(int i=0;i<26;i++) fii[i]=0;
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct TRIE
{
    int nr_apar,nr_fii;
    TRIE *fii[26];
    TRIE()
    {
        nr_apar=nr_fii=0;
        set0;
    }
}*G;
char cuv[30];
int sw;
void add()
{
    int i=0;
    TRIE *p=G;
    while(cuv[i] && p->fii[(int)cuv[i]-'a'])
        p=p->fii[(int)cuv[i++]-'a'];
    if(!cuv[i])
    {
        p->nr_apar++;
        return;
    }
    while(cuv[i])
    {
        p->nr_fii++;
        p->fii[(int)cuv[i]-'a']=new TRIE;
        p=p->fii[(int)cuv[i]-'a'];
        i++;
    }
    p->nr_apar++;
}
void print_cuv()
{
    int i=0;
    TRIE *p=G;
    while(cuv[i] && p->fii[(int)cuv[i]-'a'])
        p=p->fii[(int)cuv[i++]-'a'];
    if(!cuv[i])
        g<<p->nr_apar<<'\n';
    else
        g<<0<<'\n';
}
void printf_pref()
{
    int i=0;
    TRIE *p=G;
    while(cuv[i] && p->fii[(int)cuv[i]-'a'])
        p=p->fii[(int)cuv[i++]-'a'];
    g<<i<<'\n';
}
inline void del(int i,TRIE *p)
{
    if(cuv[i])
        del(i+1,p->fii[(int)cuv[i]-'a']);
    else
        p->nr_apar--;
    if(sw==1)
    {
        p->nr_fii--;
        p->fii[(int)cuv[i]-'a']=0;
        sw=0;
    }
    if(!p->nr_apar && !p->nr_fii && p!=G)
    {
        delete p;
        sw=1;
    }
}
int main()
{
    int choice;
    G=new TRIE;
    while(f>>choice>>cuv)
    {
        switch(choice)
        {
            case 0:
                {
                    add();
                    break;
                }
            case 1:
                {
                    del(0,G);
                    break;
                }
            case 2:
                {
                    print_cuv();
                    break;
                }
            case 3:
                {
                    printf_pref();
                    break;
                }
        }
    }
    f.close();
    g.close();
    return 0;
}