Cod sursa(job #1070530)

Utilizator andreiiiiPopa Andrei andreiiii Data 1 ianuarie 2014 14:52:16
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    int cnt, nr;
    Trie *fiu[26];
    Trie()
    {
        cnt=nr=0;
        memset(fiu, 0, sizeof(fiu));
    }
};

Trie *T=new Trie;

void tinsert(Trie *nod, char *s)
{
    if(*s=='\0')
    {
        nod->cnt++;
        return;
    }
    if(nod->fiu[*s-'a']==0)
    {
        nod->fiu[*s-'a']=new Trie;
        nod->nr++;
    }
    tinsert(nod->fiu[*s-'a'], s+1);
}

int tdelete(Trie *nod, char *s)
{
    if(*s=='\0') nod->cnt--;
    else if(tdelete(nod->fiu[*s-'a'], s+1))
    {
        nod->nr--;
        nod->fiu[*s-'a']=0;
    }
    if(nod->cnt==0&&nod->nr==0&&nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int tquery(Trie *nod, char *s)
{
    if(*s=='\0') return nod->cnt;
    if(nod->fiu[*s-'a']) return tquery(nod->fiu[*s-'a'], s+1);
    return 0;
}

int tprefix(Trie *nod, char *s, int k)
{
    if(*s=='\0'||nod->fiu[*s-'a']==0) return k;
    if(nod->fiu[*s-'a']) return tprefix(nod->fiu[*s-'a'], s+1, k+1);
    return 0;
}

int main()
{
    char cit[35];
    while(fin.getline(cit, 40))
    {
        if(cit[0]=='0') tinsert(T, cit+2);
        else if(cit[0]=='1') tdelete(T, cit+2);
        else if(cit[0]=='2') fout<<tquery(T, cit+2)<<"\n";
        else fout<<tprefix(T, cit+2, 0)<<"\n";
    }
    fin.close();
    fout.close();
}