Pagini recente » Cod sursa (job #80181) | Cod sursa (job #621711) | Cod sursa (job #1139756) | Cod sursa (job #1044457) | Cod sursa (job #2929310)
#include <bits/stdc++.h>
using namespace std;
struct Trie
{
int Nr,NrSons;
Trie * Son[26];
Trie()
{
Nr = NrSons = 0;
for(int i = 0; i < 26; ++i)
Son[i] = 0;
}
};
Trie * T = new Trie;
char Line[25];
void Insert(char * Cuv, Trie * Nod)
{
if(*Cuv == 0)
{
Nod->Nr++;
return;
}
if(!Nod->Son[Cuv[0] - 'a'])
{
Nod->Son[Cuv[0] - 'a'] = new Trie;
Nod->NrSons++;
}
Insert(Cuv + 1, Nod->Son[*Cuv - 'a']);
}
int Print(char * Cuv, Trie * Nod)
{
if(*Cuv == 0)
return Nod->Nr;
if(Nod->Son[Cuv[0] - 'a'] == 0)
return 0;
return Print(Cuv + 1, Nod->Son[Cuv[0] - 'a']);
}
int Prefix(char * Cuv, Trie * Nod)
{
if(*Cuv == 0 || Nod -> Son[Cuv[0] - 'a'] == 0)
return 0;
return 1 + Prefix(Cuv + 1, Nod->Son[Cuv[0] - 'a']);
}
bool Delete(char * Cuv, Trie * Nod)
{
if(*Cuv == 0)
{
Nod -> Nr--;
}
else
if( Delete(Cuv + 1, Nod->Son[Cuv[0] - 'a']) == 1)
{
Nod->Son[Cuv[0] - 'a'] = 0;
Nod->NrSons--;
}
if(Nod->Nr == 0 && Nod->NrSons == 0 && Nod != T)
{
delete Nod;
return 1;
}
return 0;
}
int main()
{
freopen("trie.in" , "r" , stdin);
freopen("trie.out" , "w" ,stdout);
cin.tie(0)->sync_with_stdio(0);
while(cin.getline(Line,25))
{
if(Line[0] == '0')
Insert(Line + 2, T);
if(Line[0] == '1')
Delete(Line + 2, T);
if(Line[0] == '2')
cout << Print(Line + 2,T) << "\n";
if(Line[0] == '3')
cout << Prefix(Line + 2, T) << "\n";
}
}