Pagini recente » Cod sursa (job #684706) | Cod sursa (job #374448) | Cod sursa (job #1736620) | Cod sursa (job #1681041) | Cod sursa (job #1649063)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie
{
int n, nsons;
Trie *son[26];
Trie()
{
n = nsons = 0;
for(int i = 0; i < 26; i++) son[i] = 0;
}
};
Trie *T = new Trie;
char s[25];
void ADD(Trie *nod, char *sir)
{
int Letter = *sir - 'a';
if(*sir == NULL)
{
cout<<"DA";
nod->n++;
return;
}
if(nod->son[Letter] == 0)
{
nod->son[Letter] = new Trie;
nod->nsons ++;
}
ADD(nod->son[Letter], sir+1);
}
int DELETE(Trie *nod, char *sir)
{
int Letter = *sir - 'a';
if(*sir == NULL)
{
nod->n--;
}
else
{
if(DELETE(nod->son[Letter], sir+1) == 1)
{
nod->son[Letter] = 0;
nod->nsons--;
}
}
if(nod->n == 0 && nod->nsons == 0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int NRAPP(Trie *nod, char *sir)
{
int Letter = *sir - 'a';
if(*sir == NULL) return nod->n;
if(nod->son[Letter] == 0) return 0;
return NRAPP(nod->son[Letter], sir+1);
}
int NRPREF(Trie *nod, char *sir, int cont)
{
int Letter = *sir - 'a';
if(*sir == NULL) return cont;
if(nod->son[Letter] == 0) return cont;
return NRPREF(nod->son[Letter], sir+1, cont+1);
}
int main()
{
while(f.getline(s,25))
{
int opt = *s - '0';
if(opt == 0) ADD(T,s+2);
if(opt == 1) DELETE(T,s+2);
if(opt == 2) g<<NRAPP(T,s+2)<<'\n';
if(opt == 3) g<<NRPREF(T,s+2,0)<<'\n';
}
return 0;
}