Pagini recente » Diferente pentru blog/google-code-jam-2008 intre reviziile 11 si 8 | Cod sursa (job #1197501) | Cod sursa (job #3340404) | Diferente pentru utilizator/devastator intre reviziile 2 si 1 | Cod sursa (job #3308409)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod {
int cnt, nrfii;
nod * fii[26];
nod() {
cnt = 0;
nrfii = 0;
for(int i = 0; i <= 25; i ++)
fii[i] = nullptr;
}
};
void adaugaCuvant(nod * trie, string cuvant, int lit = 0) {
if(lit == cuvant.size()) { // am terminat cuvantul
trie -> cnt ++;
} else {
char literaCurenta = cuvant[lit];
if(trie -> fii[literaCurenta - 'a'] == nullptr)
{
trie -> fii[literaCurenta - 'a'] = new nod;
trie -> nrfii ++;
}
adaugaCuvant(trie -> fii[literaCurenta - 'a'], cuvant, lit + 1);
}
}
int stergeCuvant(nod * trie, string cuvant, int lit = 0) {
if(lit == cuvant.size()) { // am terminat cuvantul
trie -> cnt --;
} else {
char literaCurenta = cuvant[lit];
if(trie -> fii[literaCurenta - 'a'] == nullptr)
trie -> fii[literaCurenta - 'a'] = new nod;
int sters = stergeCuvant(trie -> fii[literaCurenta - 'a'], cuvant, lit + 1);
if(sters == 1) {
trie->nrfii--;
trie -> fii[literaCurenta - 'a'] = nullptr;
}
}
if(trie -> cnt == 0 && trie -> nrfii == 0 && lit != 0) {
delete trie;
return 1; // s-a sters nodul
}
return 0; // nu s-a sters nodul
}
int aparitiiCuvant(nod * trie, string cuvant, int lit = 0) {
if(lit == cuvant.size()) { // am terminat cuvantul
return trie -> cnt;
} else {
char literaCurenta = cuvant[lit];
if(trie -> fii[literaCurenta - 'a'] == nullptr)
return 0;
return aparitiiCuvant(trie -> fii[literaCurenta - 'a'], cuvant, lit + 1);
}
}
int prefixCuvant(nod * trie, string cuvant, int lit = 0) {
if(lit == cuvant.size()) { // am terminat cuvantul
return lit;
} else {
char literaCurenta = cuvant[lit];
if(trie -> fii[literaCurenta - 'a'] == nullptr)
return lit;
return prefixCuvant(trie -> fii[literaCurenta - 'a'], cuvant, lit + 1);
}
}
int op;
string cuvant;
int main() {
nod * trie = new nod;
while(fin >> op >> cuvant) {
if(op == 0)
adaugaCuvant(trie, cuvant);
else if(op == 1)
stergeCuvant(trie, cuvant);
else if(op == 2)
fout << aparitiiCuvant(trie, cuvant) << '\n';
else if(op == 3)
fout << prefixCuvant(trie, cuvant) << '\n';
}
return 0;
}