Pagini recente » Cod sursa (job #1765180) | Cod sursa (job #2606821) | Cod sursa (job #415788) | Cod sursa (job #2824190) | Cod sursa (job #1926759)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
struct Trie
{
int cnt,nrfii;
Trie *fiu[30];
Trie()
{
nrfii=cnt=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T = new Trie;
char s[30];
void ins (Trie *node, char *s)
{
if(*s==0)
{
node->cnt++;
return;
}
if(node->fiu[*s-'a']==0)
{
node->fiu[*s-'a'] = new Trie;
node->nrfii++;
}
ins(node->fiu[*s-'a'],s+1);
}
int del (Trie *node, char *s)
{
if(*s==0)
node->cnt--;
else if(del(node->fiu[*s-'a'],s+1)==1)
{
node->fiu[*s-'a']=0;
node->nrfii--;
}
if(node->cnt==0&&node->nrfii==0&&node!=T)
{
delete node;
return 1;
}
return 0;
}
int query(Trie *node, char *s)
{
if(*s==0)
return node->cnt;
if(node->fiu[*s-'a']!=0)
return query(node->fiu[*s-'a'],s+1);
return 0;
}
int prefix (Trie *node, char *s, int k)
{
if(*s==0||node->fiu[*s-'a']==0)
return k;
return prefix(node->fiu[*s-'a'],s+1,k+1);
}
int main()
{
ifstream fin ("trie.in");
ofstream fout ("trie.out");
int q;
while(fin>>q)
{
fin>>s;
//cout<<q<<" ";
if(q==0)
ins(T,s);
if(q==1)
del(T,s);
if(q==2)
fout<<query(T,s)<<"\n";
if(q==3)
fout<<prefix(T,s,0)<<"\n";
}
return 0;
}