Pagini recente » Cod sursa (job #1039092) | Cod sursa (job #1324163) | Cod sursa (job #559792) | Cod sursa (job #71578) | Cod sursa (job #2715151)
#include <fstream>
#include <string>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
const int SIGMA = 26;
struct Node {
int nrap, nrc;
Node* children[SIGMA];
Node() {
nrap = nrc = 0;
for(int i = 0; i < SIGMA; i++) {
children[i] = NULL;
}
}
};
Node *trie = NULL;
string s;
Node* InsertTrie(Node* node, int index) {
if(node == NULL) {
node = new Node;
}
node-> nrap++;
if(index == (int)s.size()) {
node-> nrc++;
} else {
node-> children[s[index] - 'a'] = InsertTrie(node-> children[s[index] - 'a'], index + 1);
}
return node;
}
Node* DeleteTrie(Node* node, int index) {
node-> nrap--;
if(index == (int)s.size()) {
node-> nrc--;
} else {
node-> children[s[index] - 'a'] = DeleteTrie(node-> children[s[index] - 'a'], index + 1);
}
if(node-> nrap == 0) {
node = NULL;
}
return node;
}
int Count(Node* node, int index) {
if(node == NULL) {
return 0;
}
if(index == (int)s.size()) {
return node-> nrc;
}
return Count(node-> children[s[index] - 'a'], index + 1);
}
int BestPref(Node* node, int index) {
if(node == NULL) {
return -1;
}
if(index == (int)s.size()) {
return 0;
}
return 1 + BestPref(node-> children[s[index] - 'a'], index + 1);
}
int main() {
int t;
while(cin >> t >> s) {
if(t == 0) {
///insert
trie = InsertTrie(trie, 0);
} else if(t == 1) {
///delete
trie = DeleteTrie(trie, 0);
} else if(t == 2) {
///count
cout << Count(trie, 0) << '\n';
} else {
///bestPref
cout << BestPref(trie, 0) << '\n';
}
}
return 0;
}