Pagini recente » Cod sursa (job #2714584) | Cod sursa (job #1064096) | Cod sursa (job #421972) | Cod sursa (job #2764548) | Cod sursa (job #1365707)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int maxn = 25;
const int sigma = 26;
int n, m;
char s[maxn];
struct node {
node *sons[sigma];
int endings, fr;
node () {
endings = 0;
fr = 0;
memset(sons, 0, sizeof(sons));
}
} *root;
inline void _insert(node *root, char *s) {
if(!*s) {
++ root->endings;
++ root->fr;
return;
}
++ root->fr;
int son = *s - 'a';
if(!root->sons[son])
root->sons[son] = new node();
_insert(root->sons[son], s + 1);
}
inline void _erase(node *root, char *s) {
if(!*s) {
-- root->endings;
-- root->fr;
return ;
}
-- root->fr;
_erase(root->sons[*s - 'a'], s + 1);
}
inline int _find(node *root, char *s) {
if(root->fr == 0)
return 0;
if(!*s)
return root->endings;
if(!root->sons[*s - 'a'])
return 0;
return _find(root->sons[*s - 'a'], s + 1);
}
inline int _prefix(node *root, char *s) {
if(root->sons[*s - 'a'] && root->sons[*s - 'a']->fr)
return 1 + _prefix(root->sons[*s - 'a'], s + 1);
return 0;
}
int main() {
root = new node();
int op;
while(fin >> op >> s + 1) {
if(op == 0) _insert(root, s + 1);
else if(op == 1) _erase(root, s + 1);
else if(op == 2) fout << _find(root, s + 1) << '\n';
else if(op == 3) fout << _prefix(root, s + 1) << '\n';
}
}