Pagini recente » Cod sursa (job #2177225) | Cod sursa (job #1219732) | Cod sursa (job #1730883) | Cod sursa (job #844847) | Cod sursa (job #1577097)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
struct Trie {
int cnt, nrfii;
Trie *fiu[26];
Trie() {
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
char s[25];
void _insert(Trie *node, char *s) {
if(!*s) {
node->cnt ++;
return;
}
int delta = *s - 'a';
if(node->fiu[delta] == NULL) {
node->fiu[delta] = new Trie();
node->nrfii ++;
}
_insert(node->fiu[delta], s + 1);
}
int _freq(Trie *node, char *s) {
if(!*s)
return node->cnt;
int delta = *s - 'a';
if(node->fiu[delta] == NULL)
return 0;
return _freq(node->fiu[delta], s + 1);
}
int _lcp(Trie *node, char *s) {
if(!*s)
return 0;
int delta = *s - 'a';
if(node->fiu[delta] == NULL)
return 0;
return 1 + _lcp(node->fiu[delta], s + 1);
}
bool _erase(Trie *node, char *s) {
if(!*s) {
node->cnt --;
if(node->cnt == 0 && node->nrfii == 0) {
delete node;
return 1;
}
return 0;
}
int delta = *s - 'a';
if(_erase(node->fiu[delta], s + 1)) { /// daca am eliminat fiul delta, decrementez numarul de fii
node->nrfii --;
node->fiu[delta] = 0;
if(node->cnt == 0 && node->nrfii == 0) {
delete node;
return 1;
}
}
return 0;
}
void dfs(Trie *node, string s) {
if(node->cnt)
cout << "Sirul este:\n" << s << '\n';
for(int i = 0 ; i < 26 ; ++ i)
if(node->fiu[i])
dfs(node->fiu[i], s + (char)(i + 'a'));
}
int main() {
ifstream fin("trie.in");
ofstream fout("trie.out");
Trie *root = new Trie(); /// creem nodul 'vid' (radacina)
/*
0 w - adauga o aparitie a cuvantului w in lista
1 w - sterge o aparitie a cuvantului w din lista
2 w - tipareste numarul de aparitii ale cuvantului w in lista
3 w - tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista*/
int op;
while(fin >> op >> s) {
if(root == NULL)
root = new Trie();
if(op == 0) {
_insert(root, s);
}
if(op == 1) {
_erase(root, s);
}
else if(op == 2) {
fout << _freq(root, s) << '\n';
}
else if(op == 3) {
fout << _lcp(root, s) << '\n';
}
}
}