Pagini recente » Cod sursa (job #36896) | Cod sursa (job #2456159) | Cod sursa (job #1248484) | Cod sursa (job #2027836) | Cod sursa (job #1409821)
#include <cstdio>
using namespace std;
struct Trie
{
Trie *son[26];
int cnt, sons;
Trie()
{
cnt = sons = 0;
for(int i=0;i<26;++i)
son[i] = NULL;
}
};
Trie *T = new Trie;
int step;
inline void Add(Trie *&T,char *s)
{
if(s[0]==0)
{
T->cnt++;
return ;
}
int f = s[0]-'a';
if(T->son[f] == NULL)
{
++T->sons;
T->son[f] = new Trie;
}
Add(T->son[f],s+1);
}
inline int Cnt(Trie *&T,char *s)
{
if(s[0]==0)
return T->cnt;
if(T->son[s[0]-'a'] == 0)
return 0;
return Cnt(T->son[s[0]-'a'],s+1);
}
inline int Solve(Trie *&T,char *s)
{
if(s[0] == 0)
return 0;
if(T->son[s[0]-'a']==0)
return 0;
return 1+Solve(T->son[s[0]-'a'],s+1);
}
inline bool Delete(Trie *&T,char *s)
{
if(s[0] == 0)
{
--T->cnt;
if(T->cnt == 0 && T->sons ==0){
T = NULL;
delete T;
return true;
}
return false;
}
int f = s[0]-'a';
if(Delete(T->son[f],s+1))
{
--T->sons;
if(T->cnt == 0 && T->sons ==0){
T = NULL;
delete T;
return true;
}
}
return false;
}
char s[30];
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(gets(s))
{
if(s[0]=='0')
Add(T,s+2);
else
if(s[0]=='1')
Delete(T,s+2);
else
if(s[0]=='2')
printf("%d\n",Cnt(T,s+2));
else
printf("%d\n",Solve(T,s+2,0));
}
return 0;
}