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