Cod sursa(job #1665202)

Utilizator andreiudilaUdila Andrei andreiudila Data 26 martie 2016 17:59:20
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

int op;
string w;

struct trie{

int nrcuvt;
int nrcuvf;

trie *a[26];

trie(){

nrcuvt=0;
nrcuvf=0;
memset(a,0,sizeof(a));
}

};

trie *root;
trie *aux;

void insert(string w)
{
    aux=root;
    aux->nrcuvt++;

    for(int i=0;i<w.length();++i)
    {
        if((aux->a[w[i]-'a'])==NULL)
               aux->a[w[i]-'a']=new trie();

        aux=aux->a[w[i]-'a'];
        ++aux->nrcuvt;
    }
    ++aux->nrcuvf;

}

void erase(string w)
{
    aux=root;
    --aux->nrcuvt;

    for(int i=0; i<w.length(); ++i)
    {
        //if (aux->a[w[i]-'a']==NULL) return;
        aux=aux->a[w[i]-'a'];
        --aux->nrcuvt;
    }

    --aux->nrcuvf;
}

int prefix(string w)
{
    int i=0;

    aux=root;

    for(i=0; i<w.length(); ++i)
    {
        if(aux->a[w[i]-'a']==NULL || aux->nrcuvt==0) break;
        else aux=aux->a[w[i]-'a'];
    }

    return i;
}

int nrapp(string w)
{
    int i=0;

    aux=root;

    for(i=0; i<w.length(); ++i)
    {
        if(aux->a[w[i]-'a']==NULL) return 0;
        else aux=aux->a[w[i]-'a'];
    }
    return aux->nrcuvf;
}

int main()
{
    root=new trie();

    while(fin>>op)
    {
        fin>>w;
        if(op==0) insert(w);
        else if(op==1) erase(w);
        else if(op==2) fout<<nrapp(w)<<"\n";
        else fout<<prefix(w)<<"\n";
    }
    return 0;
}