Pagini recente » Cod sursa (job #2283312) | Cod sursa (job #256548) | Cod sursa (job #2006332) | Diferente pentru utilizator/raresegay intre reviziile 2 si 3 | Cod sursa (job #1575751)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int Nr,NrSons;
Trie * Son[26];
Trie()
{
Nr = NrSons = 0;
for(int i = 0; i < 26; i++)
Son[i] = NULL;
}
};
Trie * T = new Trie;
void Insert(Trie * Nod, char * p)
{
int Letter = *p - 'a';
if(*p == 0)
{
Nod->Nr++;
return;
}
if(Nod->Son[Letter]==0)
{
Nod->NrSons++;
Nod->Son[Letter] = new Trie;
}
Insert(Nod->Son[Letter],p+1);
}
int Delete(Trie * Nod, char * p)
{
int Letter = *p - 'a';
if(*p == 0)
Nod -> Nr--;
else
if(Delete(Nod->Son[Letter] , p+1) == 1)
{
Nod -> Son[Letter] = 0;
Nod -> NrSons--;
}
if(Nod -> Nr == 0 && Nod -> NrSons == 0 && Nod != T)
{
delete Nod;
return 1;
}
return 0;
}
int Find(Trie * Nod, char * p)
{
int Letter = *p - 'a';
if(*p == 0)
return Nod->Nr;
if(Nod->Son[Letter])
return Find(Nod->Son[Letter],p+1);
return 0;
}
int FindP(Trie * Nod, char * p,int Count)
{
int Letter = *p - 'a';
if(*p == 0 || Nod->Son[Letter] == 0)
return Count;
return FindP(Nod->Son[Letter],p + 1,Count + 1);
}
int main()
{
char S[100];
while(fin.getline(S,100))
{
int op = S[0]-48;
if(op == 0)
Insert(T,S+2);
if(op == 1)
Delete(T,S+2);
if(op == 2)
fout<<Find(T,S+2)<<"\n";
if(op == 3)
fout<<FindP(T,S+2,0)<<"\n";
}
return 0;
}