Pagini recente » Cod sursa (job #2787966) | Cod sursa (job #1057376) | Cod sursa (job #1326455) | Cod sursa (job #308068) | Cod sursa (job #2720525)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie
{
int word, nrFii;
Trie *fiu[26];
Trie()
{
word = 0;
nrFii = 0;
memset(fiu, 0, sizeof fiu);
}
};
int q;
char s[30];
Trie* T = new Trie;
void add(Trie *node, char *s)
{
int x = *s - 'a';
if(*s == '\0')
{
node -> word++;
return;
}
if(node -> fiu[x] == nullptr)
{
node -> nrFii++;
node -> fiu[x] = new Trie;
}
add(node -> fiu[x], s + 1);
}
bool del(Trie *node, char *s)
{
int x = *s - 'a';
//cout << *s << ' ';
if(*s == '\0')
node -> word--;
else if(node -> fiu[x] != nullptr && del(node -> fiu[x], s + 1))
{
node -> nrFii--;
node -> fiu[x] = nullptr;
}
if(node != T && node -> word == 0 && node -> nrFii == 0)
{
delete node;
return true;
}
return false;
}
int cuv(Trie *node, char *s)
{
int x = *s - 'a';
//cout << *s << ' ';
if(*s == '\0')
return node -> word;
if(node -> fiu[x] == nullptr)
return 0;
return cuv(node -> fiu[x], s + 1);
}
int pre(Trie *node, char *s)
{
int x = *s - 'a';
//cout << *s << '\n';
if(*s == '\0')
return 0;
if(node -> fiu[x] == nullptr)
return 0;
return pre(node -> fiu[x], s + 1) + 1;
}
int main()
{
while(in >> q >> s)
{
switch(q)
{
case 0:
add(T, s);
break;
case 1:
del(T, s);
break;
case 2:
out << cuv(T, s) << '\n';
break;
case 3:
out << pre(T, s) << '\n';
break;
default:
break;
}
memset(s, 0, sizeof s);
}
return 0;
}