Pagini recente » Cod sursa (job #2024824) | Cod sursa (job #2669413) | Cod sursa (job #321377) | Cod sursa (job #1359211) | Cod sursa (job #1118263)
#include <string>
#include <fstream>
using namespace std;
struct Nod {
int nr_fii;
int frecv;
Nod* fii[26];
Nod(void) {
frecv = nr_fii = 0;
for(int i = 0; i < 26; ++i)
fii[i] = 0;
}
};
Nod* trie = new Nod();
void insert(Nod* nod, const string& cuv, int poz) {
if(poz == cuv.size()) {
++nod->frecv;
return;
}
int fiu = cuv[poz] - 'a';
if(nod->fii[fiu] == 0) {
nod->fii[fiu] = new Nod();
++nod->nr_fii;
}
insert(nod->fii[fiu], cuv, poz+1);
}
bool erase(Nod* nod, const string& cuv, int poz) {
int fiu = cuv[poz] - 'a';
if(poz == cuv.size()) {
--nod->frecv;
}
else if(erase(nod->fii[fiu], cuv, poz+1)) {
--nod->nr_fii;
nod->fii[fiu] = 0;
}
if(nod->frecv == 0 && nod->nr_fii == 0 && nod != trie) {
delete nod;
return true;
}
return false;
}
int frecv_cuv(Nod* nod, const string& cuv, int poz) {
if(poz == cuv.size())
return nod->frecv;
int fiu = cuv[poz] - 'a';
if(nod->fii[fiu] != 0)
return frecv_cuv(nod->fii[fiu], cuv, poz+1);
return 0;
}
int cml_prefix_comun(Nod* nod, const string& cuv, int poz) {
if(poz == cuv.size())
return poz;
else {
int fiu = cuv[poz] - 'a';
if(nod->fii[fiu] != 0)
return cml_prefix_comun(nod->fii[fiu], cuv, poz+1);
return poz;
}
}
int main(void) {
ifstream fin("trie.in");
ofstream fout("trie.out");
string cuv; int opt;
while(fin >> opt) {
fin >> cuv;
if(opt == 0)
insert(trie, cuv, 0);
if(opt == 1)
erase(trie, cuv, 0);
if(opt == 2)
fout << frecv_cuv(trie, cuv, 0) << '\n';
if(opt == 3)
fout << cml_prefix_comun(trie, cuv, 0) << '\n';
}
fin.close();
fout.close();
}