Pagini recente » Cod sursa (job #2679414) | Cod sursa (job #1552897) | Cod sursa (job #2509573) | Cod sursa (job #1433256) | Cod sursa (job #2369253)
#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=trie;
for(int i=0; i<v.size(); i++)
{
p->x[v[i]-'a']->cnt--;
if(p->x[v[i]-'a']->cnt==0)
{
p->x[v[i]-'a']=NULL;
return;
}
p=p->x[v[i]-'a'];
}
p->cnt--;
p->nr_ap--;
}
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);
}
else if(t==2)
{
out << nrap(a) << '\n';
}
else if(t==3)
{
out << prefix(a) << '\n';
}
}
}
return 0;
}