Pagini recente » Cod sursa (job #20871) | Cod sursa (job #3000167) | Cod sursa (job #1070842) | Cod sursa (job #1475602) | Cod sursa (job #828509)
Cod sursa(job #828509)
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
struct Trie {
#define SIGMA 26
int cnt, nrfii;
Trie *fiu[SIGMA];
Trie() {
memset(fiu, 0 ,sizeof(fiu));
}
};
void add(Trie *node, int len, string &s) {
if(len == s.length()) {
node->cnt++;
return;
}
if(node->fiu[s[len]-'a'] == NULL) {
node->fiu[s[len]-'a'] = new Trie();
node->nrfii++;
}
add(node->fiu[s[len]-'a'], len+1, s);
}
int find(Trie *node, int len, string &s) {
if(len == s.length()) {
return node->cnt;
}
if(node->fiu[s[len]-'a'] == NULL) {
return 0;
}
return find(node->fiu[s[len]-'a'], len+1, s);
}
bool remove(Trie *node, int len, string &s) {
if(len == s.length()) {
node->cnt--;
if(node->nrfii == 0 && node->cnt == 0) {
delete node;
return true;
}
return false;
}
if(remove(node->fiu[s[len]-'a'], len+1, s)) {
node->nrfii--;
node->fiu[s[len]-'a'] = NULL;
}
if(node->nrfii == 0 && node->cnt == 0) {
delete node;
return true;
}
return false;
}
int prefix(Trie *node, int len, string &s) {
if(len == s.length() || node->fiu[s[len]-'a'] == NULL) {
return 0;
}
if(node->fiu[s[len]-'a'] == NULL) {
node->fiu[s[len]-'a'] = new Trie();
node->nrfii++;
}
return 1 + prefix(node->fiu[s[len]-'a'], len+1, s);
}
Trie *head = new Trie();
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
string s; int x;
char str[50];
while(!feof(stdin)) {
scanf("%d %s\n", &x, str);
s = str;
if(x == 0) {
add(head, 0, s);
}
else if(x == 1) {
remove(head, 0, s);
}
else if(x == 2) {
cout << find(head, 0, s) << endl;
}
else if(x == 3) {
cout << prefix(head, 0, s) << endl;
}
}
return 0;
}