Pagini recente » Cod sursa (job #169498) | Cod sursa (job #684231) | Cod sursa (job #1238180) | Cod sursa (job #42997) | Cod sursa (job #2200410)
#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 k)
{
int val=*s-'a';
if(int(*s)==0 || nod->fiu[val]==0)
return k;
return prefix(nod->fiu[val],s+1,k+1);
}
int main()
{
char s[100];
while(fin.getline(s,100))
{
if(s[0]=='0')Insert(T,s+2);
if(s[0]=='1')Delete(T,s+2);
if(s[0]=='2')fout<<slove(T,s+2)<<"\n";
if(s[0]=='3')fout<<prefix(T,s+2,0)<<"\n";
}
return 0;
}
/**
**/