Pagini recente » Cod sursa (job #2229361) | Cod sursa (job #1074250) | Cod sursa (job #301687) | Cod sursa (job #3228507) | Cod sursa (job #2202510)
#include <cstring>
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int cnt,nr_fii;
Trie *fiu[26];
Trie()
{
cnt=nr_fii=0;
for(int i=0;i<26;i++)
fiu[i]=0;
}
};
Trie *T=new Trie;
void Insert(Trie *nod,char *s)
{
if(int(*s)==0)
{
nod->cnt++;
return;
}
int val=*s-'a';
if(nod->fiu[val]==0)
{
nod->fiu[val]=new Trie;
nod->nr_fii++;
}
Insert(nod->fiu[val],s+1);
}
int Delete(Trie *nod,char *s)
{
int val=*s-'a';
if(int(*s)==0)
nod->cnt--;
else
if(Delete(nod->fiu[val],s+1)==1)
{
nod->fiu[val]=0;
nod->nr_fii--;
}
if(nod->cnt==0 && nod->nr_fii==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int slove(Trie *nod,char *s)
{
if(int(*s)==0)
return nod->cnt;
int val=*s-'a';
if(nod->fiu[val])
return slove(nod->fiu[val],s+1);
return 0;
}
int prefix(Trie *nod,char *s)
{
int val=*s-'a';
if(int(*s)==0 || nod->fiu[val]==0)
return 0;
return 1+prefix(nod->fiu[val],s+1);
}
int main(){
int tip;
char s[20];
while(fin>>tip>>s){
switch(tip){
case 0: Insert(T,s);
break;
case 1: Delete(T,s);
break;
case 2:fout<<slove(T,s)<<'\n';
break;
case 3:fout<<prefix(T,s)<<'\n';
break;
}
}
return 0;
}