Cod sursa(job #723122)
#include<fstream>
#include<string>
#include<cstring>
#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++)
pN=pN->nlist[alf(a[i])];
nod* pLast=pN->nlist[alf(a[a.size()-1])];
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 -1;
}
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);
break;
case 3:
fout<<pre_com(&trie,w);
}
}
return 0;
}