Pagini recente » Cod sursa (job #2206882) | Cod sursa (job #101507) | Cod sursa (job #1100201) | Cod sursa (job #2319456) | Cod sursa (job #2369427)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie{
trie *fii[30];
int nr_ap=0;
int nr_fii=0;
};
trie *t=new trie;
void inserare(string &v)
{
trie *nod=t;
for(int i=0; i<v.size(); i++)
{
if(!nod->fii[v[i]-'a'])
{
nod->fii[v[i]-'a']=new trie;
}
nod->nr_fii++;
nod=nod->fii[v[i]-'a'];
}
nod->nr_ap++;
}
bool del(string &v,trie *p,int poz)
{
if(v.size()==poz)
{
p->nr_ap--;
}
else if(del(v,p->fii[v[poz]-'a'],poz+1))
{
p->nr_fii--;
p->fii[v[poz]-'a']=NULL;
}
if(p->nr_ap==0 && p->nr_fii==0 && p!=t)
{
delete p;
return 1;
}
return 0;
}
int de_cate_ori_o_aparut(string &v,trie *p,int poz)
{
if(v.size()==poz)
{
return p->nr_ap;
}
else
{
if(!p->fii[v[poz]-'a'])
return 0;
else
return de_cate_ori_o_aparut(v,p->fii[v[poz]-'a'],poz+1);
}
}
int lg_max(string &v)
{
trie *nod=t;
for(int i=0; i<v.size(); i++)
{
if(!nod->fii[v[i]-'a'])
return i;
nod=nod->fii[v[i]-'a'];
}
return v.size();
}
string a;
int x;
int main()
{
while(!in.eof())
{
in >> x;
in >> a;
if(!in.eof())
{
if(x==0)
inserare(a);
else if(x==1)
del(a,t,0);
else if(x==2)
out << de_cate_ori_o_aparut(a,t,0) << '\n';
else
out << lg_max(a) << '\n';
}
}
return 0;
}