Pagini recente » Cod sursa (job #2528015) | Cod sursa (job #2589617) | Cod sursa (job #209648) | Cod sursa (job #1458527) | Cod sursa (job #1706363)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
char sir[200];
int type;
struct Trie {
int cnt , nrf;
Trie *fiu[26];
Trie() {
cnt = nrf = 0;
memset(fiu , 0 , sizeof(fiu));
}
};
Trie *Root = new Trie;
void adauga(Trie *node , char *s) {
if(*s == '\0') {
node -> cnt++;
return;
}
char qq = *s - 'a';
if(node -> fiu[qq] == NULL) {
node -> fiu[qq] = new Trie;
node -> nrf++;
}
adauga(node -> fiu[qq] , s + 1);
}
int sterge(Trie *node , char *s) {
char qq = *s - 'a';
if(*s == '\0') {
node -> cnt--;
}
else {
if(sterge(node -> fiu[qq] , s + 1)) {
node -> fiu[qq] = NULL;
node -> nrf--;
}
}
if(node -> nrf == 0 && node -> cnt == 0 && node != Root) {
delete node;
return 1;
}
return 0;
}
int nrap(Trie *node , char *s) {
if(*s == '\0') {
return node -> cnt;
}
char qq = *s - 'a';
if(node -> fiu[qq] != NULL) {
return nrap(node -> fiu[qq] , s + 1);
}
return 0;
}
int prefix(Trie *node , char *s , int lg) {
if(*s == '\0') {
return lg;
}
char qq = *s - 'a';
if(node -> fiu[qq] != NULL) {
return prefix(node -> fiu[qq] , s + 1 , lg + 1);
}
return lg;
}
int main() {
while(f >> type) {
memset(sir , 0 , sizeof(sir));
f >> sir;
if(type == 0) {
adauga(Root , sir);
}
if(type == 1) {
sterge(Root , sir);
}
if(type == 2) {
g << nrap(Root , sir) << '\n';
}
if(type == 3) {
g << prefix(Root , sir , 0) << '\n';
}
}
return 0;
}