Pagini recente » Cod sursa (job #2627762) | Cod sursa (job #1136377) | Cod sursa (job #2350901) | Cod sursa (job #704153) | Cod sursa (job #2231359)
#include <bits/stdc++.h>
#define ch (*s-'a')
using namespace std;
ifstream in ("trie.in");
ofstream out("trie.out");
char s[28];
struct trie
{int nr , fii;
trie *fiu[28];
trie()
{
nr=fii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *dict= new trie;
void adaug (trie *t, char *s)
{
if(*s==NULL)
{
// daca am terminat cuvantul
t->nr++;
return ;
}
if(!t->fiu[ch])
{
t->fiu[ch]=new trie;
t->fii++;
}
adaug(t->fiu[ch],s+1);
}
int prefix( trie *t, char *s, int k)
{
if(*s==NULL or !t->fiu[ch] )
{
return k;
}
prefix(t->fiu[ch],s+1,k+1);
}
int nr_ap(trie *t, char *s)
{
if(*s==NULL)
{
return t->nr;
}
if(t->fiu[ch])
return nr_ap(t->fiu[ch],s+1);
return 0;
}
int del(trie *t, char *s)
{
if(*s==NULL)
{
t->nr--;
}
else
{
if( del(t->fiu[ch],s+1) )
{
// daca pot sa il sterg pe urmatoru
t->fiu[ch]=0;
t->fii--;
}
else
{
if(t->fii==0 and t->nr==0 and t!=dict)
{
delete t;
return 1;
}
}
}
return 0;
}
int main()
{
in.getline(s,28);
while(!in.eof())
{
if(s[0]=='0')
{
adaug(dict,s+2);
}
else if(s[0]=='1')
{
del(dict,s+2);
}
else if(s[0]=='2')
{
out<<nr_ap(dict,s+2)<<"\n";
}
else out<<prefix(dict,s+2,0)<<"\n";
in.getline(s,28);
}
return 0;
}