Pagini recente » Monitorul de evaluare | Cod sursa (job #1784530) | Cod sursa (job #1771185) | Cod sursa (job #2593579) | Cod sursa (job #2402458)
#define DM 21
#define DN 31
#include <fstream>
using namespace std;
ifstream fi ("trie.in");
ofstream fo ("trie.out");
char cuv[DM];
int q;
struct trie {
int ending, nrSons;
trie * sons[DN];
trie() {
ending = nrSons = 0;
for (int i = 0; i < DN; ++i)
sons[i] = 0;
}
void display() {
fo << "nrSons : " << nrSons << " - ending : " << ending << '\n';
}
};
trie * root = new trie();
void addWord(char * c, trie * crt) {
if (*c == '\0') {
++(crt->ending);
return;
}
++(crt->nrSons);
int idx = *c - 'a';
if (crt->sons[idx] == 0)
crt->sons[idx] = new trie();
addWord(c + 1, crt->sons[idx]);
}
void deleteWord(char * c, trie * crt) {
if (*c == '\0') {
--(crt->ending);
return;
}
int idx = *c - 'a';
deleteWord(c + 1, crt->sons[idx]);
--(crt->nrSons);
if (!(crt->nrSons))
delete (crt->sons[idx]);
}
int findWord(char * c, trie * crt) {
if (*c == '\0')
return (crt->ending);
int idx = *c - 'a';
if (crt->sons[idx] == 0)
return 0;
return findWord(c + 1, crt->sons[idx]);
}
int maxPrefix(char * c, trie * crt, int depth) {
if (*c == '\0' || (crt->nrSons) < 2)
return depth;
int idx = *c - 'a';
return maxPrefix(c + 1, crt->sons[idx], depth + 1);
}
void parcurge(trie * crt) {
crt->display();
for (int i = 0; i < DN; ++i)
if (crt->sons[i] != 0) {
char aux = 'a';
aux += i;
fo << "entering " << aux << '\n';
parcurge(crt->sons[i]);
}
}
int main() {
while (fi >> q) {
fi >> cuv;
switch (q) {//ba, jur ca nu-s gay, vreau numai sa vad cum merge switch
case 0:
addWord(cuv, root);
break;
case 1:
deleteWord(cuv, root);
break;
case 2:
fo << findWord(cuv, root) << '\n';
break;
case 3:
fo << maxPrefix(cuv, root, 0) << '\n';
break;
default:
fo << "ba ce pula mea";
}
}
// parcurge(root);
}