Pagini recente » Cod sursa (job #2031627) | Cod sursa (job #1087513) | Cod sursa (job #2354356) | Cod sursa (job #3039368) | Cod sursa (job #2975963)
#include <fstream>
#include <cstring>
#define ch (*s - 'a')
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct Trie{
int nr_cuv, nr_sons;
Trie* son[26];
Trie(){
nr_cuv = nr_sons = 0;
memset(son, 0, sizeof(son));
}
};
Trie *T = new Trie;
char sir[26];
void Insert(Trie *nod, char *s)
{
if(*s == '\0')
{
nod -> nr_cuv ++;
return;
}
else if (nod -> son[ch] == 0)
{
nod -> son[ch] = new Trie;
nod -> nr_sons ++;
}
Insert(nod ->son[ch], s + 1);
}
bool del(Trie *nod, char *s)
{
if (*s == '\0')
nod -> nr_cuv --;
else if (del(nod -> son[ch], s + 1))
{
nod -> son[ch] = 0;
nod -> nr_sons --;
}
if (nod -> nr_cuv == 0 && nod -> nr_sons == 0 && nod != T)
{
delete nod;
return true;
}
return false;
}
int Count(Trie *nod, char *s)
{
if (*s == '\0')
return nod -> nr_cuv;
if (nod -> son[ch])
return Count(nod -> son[ch], s + 1);
return 0;
}
int Prefix(Trie *nod, char *s, int k)
{
if (*s == '\0' || nod -> son[ch] == 0)
return k;
return Prefix(nod -> son[ch], s + 1, k + 1);
}
int main()
{
char sir[26];
while(cin.getline(sir, 26))
{
switch(sir[0])
{
case '0': Insert(T, sir + 2);
break;
case '1': del(T, sir + 2);
break;
case '2': cout << Count(T, sir + 2) << '\n';
break;
case '3': cout << Prefix(T, sir + 2, 0) << '\n';
}
}
return 0;
}