Pagini recente » Cod sursa (job #1829473) | Cod sursa (job #1874930) | Cod sursa (job #1028364) | Cod sursa (job #3325062) | Cod sursa (job #3309038)
#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;
}