Pagini recente » Cod sursa (job #1293002) | Cod sursa (job #1284405) | Cod sursa (job #2162448) | Cod sursa (job #1289434) | Cod sursa (job #1542852)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie{
int nr, fii;
trie *fiu[26];
} *t;
char s[31];
bool sters;
void build(trie *nod)
{
nod->fii=0;
nod->nr=0;
for(int i=0;i<26;i++)
nod->fiu[i]=0;
}
void add(trie *nod, char *p)
{
if(*p=='\0') {nod->nr++; return;}
int lit = *p-'a';
if(nod->fiu[lit]==0){
nod->fii++;
nod->fiu[lit] = new trie;
build(nod->fiu[lit]);
}
add(nod->fiu[lit], p+1);
}
void del(trie *nod, char *p)
{
if(*p=='\0')
{ nod->nr--;
if(nod->nr==0&&nod->fii==0&&nod!=t)
{
delete nod;
sters=1;
}
return;
}
int lit=*p-'a';
del(nod->fiu[lit],p+1);
if(sters)
{ nod->fii--;
nod->fiu[lit]=0;
if(nod->nr==0&&nod->fii==0&&nod!=t)
{
delete nod;
return;
}
}
sters=0;
}
int cnt(trie *nod, char *p)
{
if(*p=='\0')return nod->nr;
int lit=*p-'a';
if(nod->fiu[lit]==NULL)return 0;
return cnt(nod->fiu[lit],p+1);
}
int prefix(trie *nod, char *p, int l)
{
if(p=='\0')return l;
int lit=*p-'a';
if(nod->fiu[lit]==0)return l;
return prefix(nod->fiu[lit],p+1,l+1);
}
int main()
{
char d;
t = new trie;
build(t);
while(in>>d)
{
in.get();
in.getline(s+1,33);
if(d=='0') add(t,s+1);
if(d=='1'){sters=0;del(t,s+1);}
if(d=='2')out<<cnt(t,s+1)<<'\n';
if(d=='3')out<<prefix(t,s+1,0)<<'\n';
}
return 0;
}