Cod sursa(job #723240)

Utilizator algotrollNume Fals algotroll Data 25 martie 2012 09:43:03
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream>
#include<string>
#include<cstring>
#include<vector>
#include<map>
using namespace std;

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

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

void erase(nod* pN, string &a)
{
    for (int i=0;i<a.size();i++)
    {
        pN->nS--;
        pN=pN->vS[a[i]-'a'];
    }
    pN->ap--;
}

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

int prefc(nod* pN, string &a)
{
    for (int i=0;i<a.size();i++)
    {
        if (pN->nS==0||pN->vS[a[i]-'a']==0) return i;
        pN=pN->vS[a[i]-'a'];
    }
    return pN->ap;
}

int main()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    nod trie;
    while (!fin.eof())
    {
        int op; string w;
        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<<prefc(&trie,w)<<'\n';
        }
    }
    return 0;
}