Pagini recente » Cod sursa (job #475984) | Cod sursa (job #1132725) | Cod sursa (job #1132713) | Cod sursa (job #742865) | Cod sursa (job #723236)
Cod sursa(job #723236)
#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;
}