Pagini recente » Cod sursa (job #754627) | Cod sursa (job #723240)
Cod sursa(job #723240)
#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;
}