Pagini recente » Cod sursa (job #3174036) | Cod sursa (job #1391259) | Cod sursa (job #258292) | Cod sursa (job #93001) | Cod sursa (job #2081537)
#include <fstream>
#define DEF 25
using namespace std;
struct nod {
int info;
int fii;
nod * v[26];
nod () {
info = fii = 0;
for (int i = 0; i < 26; ++ i)
v[i] = NULL;
}
};
ifstream fin ("trie.in");
ofstream fout ("trie.out");
nod * root = new nod;
char w[DEF];
int t;
void trie_add (nod * & r, char * s) {
if (* s == 0) {
++ r -> info;
}
else {
if (r -> v[* s - 'a'] == NULL) {
r -> v[* s - 'a'] = new nod;
++ r -> fii;
}
trie_add (r -> v[* s - 'a'], s + 1);
}
}
int trie_check (nod * r, char * s) {
if (* s == 0) {
return r -> info;
}
else {
if (r -> v[* s - 'a'] == NULL)
return 0;
else
return trie_check (r -> v[* s - 'a'], s + 1);
}
}
void trie_delete (nod * & r, char * s) {
if (* s == 0) {
-- r -> info;
if (r -> info == 0 && r -> fii == 0 && r != root) {
delete r;
r = NULL;
}
}
else {
trie_delete (r -> v[* s - 'a'], s + 1);
if (r -> v[* s - 'a'] == NULL) {
-- r -> fii;
}
if (r -> info == 0 && r -> fii == 0 && r != root) {
delete r;
r = NULL;
}
}
}
int trie_pref (nod * r, char * s) {
if (* s == 0) {
return 1;
}
else {
if (r -> v[* s - 'a'] == NULL)
return 0;
else
return 1 + trie_pref (r -> v[* s - 'a'], s + 1);
}
}
int main () {
while (fin >> t >> w) {
if (t == 0) {
trie_add (root, w);
}
else if (t == 1) {
trie_delete (root, w);
}
else if (t == 2) {
fout << trie_check (root, w) << "\n";
}
else if (t == 3) {
fout << trie_pref (root, w) << "\n";
}
}
return 0;
}