Cod sursa(job #727074)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 27 martie 2012 18:49:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <cstring>
#define SG 27

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

int o;
string In;

struct Trie {
    int words,son;
    Trie *Son[SG];
    Trie() {
        words=son=0;
        memset(Son,0,sizeof(Son));
    }
} *T=new Trie;

void Add(Trie *Nod,int p) {
    if (p==In.size()) {
        Nod->words++;
        return;
    }
    if (Nod->Son[In[p]-'a']==NULL) {
        Nod->Son[In[p]-'a']=new Trie;
        Nod->son++;
    }
    Add(Nod->Son[In[p]-'a'],p+1);
}

bool Delete(Trie *Nod,int p) {
    if (p==In.size()) {
        Nod->words--;
    }
    else {
        if (Delete(Nod->Son[In[p]-'a'],p+1)) {
            Nod->Son[In[p]-'a']=NULL;
            Nod->son--;
        }
    }
    if (Nod->words==0 && Nod->son==0 && Nod!=T) {
        delete Nod;
        return true;
    }
    return false;
}

int Count(Trie *Nod,int p) {
    if (p==In.size()) return Nod->words;
    if (Nod->Son[In[p]-'a']==NULL) return 0;
    return Count(Nod->Son[In[p]-'a'],p+1);
}

int Prefix(Trie *Nod,int p,int k) {
    if (p==In.size()) return k;
    if (Nod->Son[In[p]-'a']==NULL) return k;
    return Prefix(Nod->Son[In[p]-'a'],p+1,k+1);
}




int main() {
    while (f >> o >> In) {
        if (o==0) Add(T,0);
        if (o==1) Delete(T,0);
        if (o==2) g << Count(T,0) << '\n';
        if (o==3) g << Prefix(T,0,0) << '\n';
    }
    f.close();g.close();
    return 0;
}