Pagini recente » Cod sursa (job #1043465) | Cod sursa (job #816046) | Cod sursa (job #3121611) | Cod sursa (job #3273105) | Cod sursa (job #2306886)
#include <fstream>
#include <iostream>
const int SIGMA = 26;
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
class Node {
public:
int nrap, nrc;
Node* fii[SIGMA];
Node() {
nrap = nrc = 0;
for(int i = 0; i < SIGMA; i++)
fii[i] = NULL;
}
};
Node* trie_insert(Node* node, char* s) {
if(node == NULL)
node = new Node;
node-> nrap++;
// cout << node-> nrap << endl;
if(s[0] == '\0'){
node-> nrc++;
// cout << node-> nrc << endl;
}
else {
node-> fii[s[0] - 'a'] = trie_insert(node-> fii[s[0] - 'a'], s + 1);
// cout << s << ' ' << node-> fii[s[0] - 'a'] << endl;
}
return node;
}
Node* trie_erase(Node* node, char* s) {
node-> nrap--;
if(s[0] == '\0')
node-> nrc--;
else
node-> fii[s[0] - 'a'] = trie_erase(node-> fii[s[0] - 'a'], s + 1);
if(node-> nrap == 0) {
delete(node);
node = NULL;
}
return node;
}
int trie_find(Node* node, char* s) {
if(node == NULL)
return 0;
if(s[0] == '\0')
return node-> nrc;
else {
// cout << s << ' ' << node-> fii[s[0] - 'a'] << endl;
return trie_find(node-> fii[s[0] - 'a'], s + 1);
}
}
int trie_prefix(Node* node, char* s) {
if(node == NULL)
return -1;
if(s[0] == '\0')
return 0;
else
return 1 + trie_prefix(node-> fii[s[0] - 'a'], s + 1);
}
int main()
{
int a;
char b[25];
Node* trie = NULL;
while(fin >> a) {
// fin.get();
fin >> b;
// cout << a << ' ' << b << endl;
if(a == 0)
trie = trie_insert(trie, b);
else if(a == 1)
trie = trie_erase(trie, b);
else if(a == 2)
fout << trie_find(trie, b) <<'\n';
else
fout << trie_prefix(trie, b) <<'\n';
}
// b[0] = 'm'; b[1] = 'a'; b[2] = 'r'; b[3] = 'e'; b[4] = '\0';
// cout << trie_find(trie, b) << endl;
return 0;
}