Pagini recente » Cod sursa (job #2248070) | Cod sursa (job #1357467) | Cod sursa (job #670448) | Cod sursa (job #101428) | Cod sursa (job #2369370)
#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;
for(unsigned int i=0; i<v.size(); i++)
{
p->cnt++;
if(!p->x[v[i]-'a'])
p->x[v[i]-'a']=new nod;
p=p->x[v[i]-'a'];
}
p->nr_ap++;
}
bool del(string &v,nod *p,int poz)
{
if(poz==v.size())
{
p->nr_ap--;
}
else if(del(v,p->x[v[poz]-'a'],poz+1))
{
p->cnt--;
p->x[v[poz]-'a']=NULL;
}
if(p->cnt==0 && p->nr_ap==0 && p!=trie)
{
delete p;
return 1;
}
return 0;
}
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;
}