Pagini recente » Cod sursa (job #87487) | Cod sursa (job #2743382) | Cod sursa (job #2694729) | Cod sursa (job #2368443) | Cod sursa (job #2369348)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct nod{
nod *x[26];
int nr_ap=0,cnt=0;
};
nod *trie=new nod;
void add(string &v)
{
if(!trie)
trie=new nod;
nod *p=trie;
p->cnt++;
for(unsigned int i=0; i<v.size(); i++)
{
if(!p->x[v[i]-'a'])
p->x[v[i]-'a']=new nod;
p=p->x[v[i]-'a'];
p->cnt++;
}
p->nr_ap++;
}
void del(string &v,nod *p,int poz)
{
if(v.size()-1==poz)
{
p->x[v[poz]-'a']->nr_ap--;
}
else
{
del(v,p->x[v[poz]-'a'],poz+1);
}
p->x[v[poz]-'a']->cnt--;
if(p->x[v[poz]-'a']->cnt==0)
{
delete p->x[v[poz]-'a'];
p->x[v[poz]-'a']=NULL;
}
}
int nrap(string &v)
{
if(!trie)
return 0;
nod *p=trie;
for(unsigned int i=0; i<v.size(); i++)
{
if(!p->x[v[i]-'a'])
return 0;
p=p->x[v[i]-'a'];
}
return p->nr_ap;
}
int prefix(string &v)
{
if(!trie)
return 0;
nod *p=trie;
for(unsigned int i=0; i<v.size(); i++)
{
if(!p->x[v[i]-'a'])
return i;
p=p->x[v[i]-'a'];
}
return v.size();
}
string a;
int t;
int main()
{
while(!in.eof())
{
in >> t;
in >> a;
if(!in.eof())
{
if(t==0)
{
add(a);
}
else if(t==1)
{
del(a,trie,0);
}
else if(t==2)
{
out << nrap(a) << '\n';
}
else if(t==3)
{
out << prefix(a) << '\n';
}
}
}
return 0;
}