Pagini recente » Cod sursa (job #17376) | ONIS 2014, Clasament Runda 1 | Cod sursa (job #1869183) | Cod sursa (job #686804) | Cod sursa (job #2856430)
#include <bits/stdc++.h>
using namespace std;
struct Trie
{
int incepute, terminate;
//aici tin si caracterul urmator
Trie* nod_next[26];
Trie()
{
incepute = 0, terminate = 0;
for(int i = 0; i < 26;i++)
{
nod_next[i] = nullptr;
}
}
};
void addword(char* word, Trie* trie)
{
trie->incepute++;
if(word[0] == 0)
{
//word ended
trie->terminate++;
return;
}
int ind = word[0] - 'a';
//daca nu exista nodul, il cream
if(trie->nod_next[ind] == nullptr)
{
trie->nod_next[ind] = new Trie;
}
//ne ducem la urmatorul
addword(word + 1, trie->nod_next[ind]);
}
void rmvword(char* word, Trie* trie)
{
//este garantat ca exista cuvantul in trie
trie->incepute--;
if(word[0] == 0)
{
//word ended
trie->terminate--;
return;
}
int ind = word[0] - 'a';
rmvword(word + 1, trie->nod_next[ind]);
// la intoarcere
if(trie->nod_next[ind]->incepute == 0)
{
// stergem trie-ul pt ca nu avem nevoie de el
delete trie->nod_next[ind];
trie->nod_next[ind] = nullptr;
return;
}
}
int afisare_ap(char* word, Trie* trie)
{
if(word[0] == 0)
{
return trie->terminate;
}
int ind = word[0] - 'a';
if(trie->nod_next[ind] == nullptr)
{
return 0;
}
return afisare_ap(word + 1, trie->nod_next[ind]);
}
int afisare_lungime_pref(char *word, Trie* trie)
{
if(trie->nod_next[word[0] - 'a'] == nullptr || *word == 0)
return 0;
return 1 + afisare_lungime_pref(word + 1, trie->nod_next[word[0] - 'a']);
}
int main()
{
std::ifstream fin("trie.in");
std::ofstream fout("trie.out");
Trie start;
int op;
char word[30];
char *p = word;
while(fin >> op)
{
fin >> word;
if(op == 0)
addword(p, &start);
else if(op == 1)
rmvword(p, &start);
else if(op == 2)
fout << afisare_ap(p, &start) << "\n";
else if(op == 3)
fout << afisare_lungime_pref(p, &start) << "\n";
}
}