Pagini recente » Cod sursa (job #2950319) | Cod sursa (job #2750329) | Cod sursa (job #1821598) | Cod sursa (job #1653157) | Cod sursa (job #1336015)
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
int nr,fii;
trie *f[26];
trie()
{
nr=fii=0;
for (int i=0;i<26;++i)
f[i]=0;
}
} *root;
int t;
char a[28];
void actualizare(trie *r, char *s)
{
if (*s==0)
{
r->nr++;
return ;
}
if (r->f[*s-'a']==NULL)
r->f[*s-'a']=new trie, r->fii++;
actualizare(r->f[*s-'a'],s+1);
}
bool sterge(trie *&r, char *s)
{
if (*s==0)
{
r->nr--;
if (r->nr==0 && r->fii==0)
{
if (r!=root) r=NULL;
return true;
}
else
return false;
}
bool ok=sterge(r->f[*s-'a'],s+1);
if (ok) r->fii--;
if (r->nr==0 && r->fii==0)
{
if (r!=root) r=NULL;
return true;
}
else
return false;
}
int aparitii(trie *r, char *s)
{
if (*s==0)
return r->nr;
if (r->f[*s-'a']==NULL)
return 0;
return aparitii(r->f[*s-'a'],s+1);
}
int prefix(trie *r, char *s)
{
if (*s==0 || r->f[*s-'a']==NULL)
return 0;
return 1+prefix(r->f[*s-'a'],s+1);
}
int main()
{
root=new trie;
while (fin>>t>>a)
{
switch (t)
{
case 0:
actualizare(root,a);
break;
case 1:
sterge(root,a);
break;
case 2:
fout<<aparitii(root,a)<<"\n";
break;
case 3:
fout<<prefix(root,a)<<"\n";
break;
}
}
return 0;
}