Pagini recente » Profil Livcristi | Cod sursa (job #2693953) | Profil Daria09 | Cod sursa (job #1551390) | Cod sursa (job #963460)
Cod sursa(job #963460)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in ("trie.in");
ofstream out ("trie.out");
struct trie
{
int ap, nrfii;
trie *next[27];
trie ()
{
memset (next, 0, sizeof (next));
ap = nrfii = 0;
}
};
trie *root = new trie;
void insert (char *S)
{
int now;
trie *T = root;
while (*S){
now = *S - 'a';
if (T -> next[now] == NULL)
T -> next[now] = new trie, T -> nrfii ++;
T = T -> next[now];
++ S;
}
T -> ap ++;
}
int aparitii (char *S)
{
int now;
trie *T = root;
while (*S){
now = *S - 'a';
if (T -> next[now] == NULL)
return 0;
T = T -> next[now];
++ S;
}
return T -> ap;
}
bool erase (trie *T, char *S)
{
if (*S == 0)
T -> ap --;
else
if (erase (T -> next[*S - 'a'], S + 1))
T -> next[*S - 'a'] = 0, T -> nrfii --;
if (T -> ap == 0 && T -> nrfii == 0 && T != root){
delete T;
return 1;
}
return 0;
}
int prefix (trie *T, char *S, int p)
{
if (*S == 0 || T -> next[*S - 'a'] == NULL)
return p;
return prefix (T -> next[*S - 'a'], S + 1, p + 1);
}
int main()
{
char S[30];
int op;
while (in >> op >> S){
if (op == 0)
insert (S);
if (op == 1)
erase (root, S);
if (op == 2)
out << aparitii (S) << "\n";
if (op == 3)
out << prefix (root, S, 0) << "\n";
}
return 0;
}