Cod sursa(job #723245)

Utilizator algotrollNume Fals algotroll Data 25 martie 2012 10:01:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<fstream>
#include<string>
#include<cstring>
#include<vector>
#include<map>
using namespace std;

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

void insert(nod* pN, string &a)
{
    for (int i=0;i<a.size();i++)
    {
        pN->apS++;
        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->apS++;
    pN->ap++;
}

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

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

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

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;
}