Cod sursa(job #723236)

Utilizator algotrollNume Fals algotroll Data 25 martie 2012 08:57:54
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<fstream>
#include<string>
#include<cstring>
#include<cstdlib>
#include<map>
using namespace std;

int alf(char q)
{
    return q-'a';
}

struct nod
{
    nod* nlist[26];
    int ap;
    nod()
    {
        memset(nlist,0,sizeof(nlist));
        ap=0;
    }
};

void insert(nod* pN, string &a)
{
    for (int i=0;i<a.size();i++)
    {
        if (pN->nlist[alf(a[i])]==0)
        {
            nod* pTmp = new nod;
            pN->nlist[alf(a[i])]=pTmp;
            pN=pTmp;
        }
        else pN=pN->nlist[alf(a[i])];
    }
    pN->ap++;
}

void erase(nod* pN, string &a)
{
    for (int i=0;i<a.size()-1;i++)
    {
        if (pN->nlist[alf(a[i])]==0) return;
        pN=pN->nlist[alf(a[i])];
    }
    nod* pLast=pN->nlist[alf(a[a.size()-1])];
    if (pLast==0) return;
    if (pLast->ap==1)
    {
        pN->nlist[alf(a[a.size()-1])]=0;
        delete pLast;
    }
    else pLast->ap--;
}

int nap(nod* pN, string &a)
{
    for (int i=0;i<a.size();i++)
    {
        if (pN->nlist[alf(a[i])]==0) return 0;
        pN=pN->nlist[alf(a[i])];
    }
    return pN->ap;
}

int pre_com(nod* pN, string &a)
{
    for (int i=0;i<a.size();i++)
    {
        if (pN->nlist[alf(a[i])]==0) return i;
        pN=pN->nlist[alf(a[i])];
    }
    return a.size();
}

int main()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    nod trie;
    while (!fin.eof())
    {
        int op; string w; w.reserve(21);
        fin>>op>>w; if (w=="") break;
        switch (op)
        {
            case 0: insert(&trie,w); break;
            case 1: erase(&trie,w); break;
            case 2: fout<<nap(&trie,w)<<'\n'; break;
            case 3: fout<<pre_com(&trie,w)<<'\n';
        }
    }
    return 0;
}