Cod sursa(job #263484)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
const int SIGMA = 26;
ifstream fin("trie.in");
ofstream fout("trie.out");
class trie {
struct trie_node {
int w, end;
trie_node* next[SIGMA];
trie_node() {
w = 0;
end = 0;
for (int i = 0; i < SIGMA; ++i) next[i] = NULL;
}
trie_node*& operator[] ( char x ) { return next[x-'a']; }
};
trie_node root;
public:
trie() {}
~trie() {}
void insert ( string s ) {
trie_node *cur = &root;
++cur->w;
for (int i = 0; i < s.size(); ++i) {
if ((*cur)[s[i]] == NULL) (*cur)[s[i]] = new trie_node;
cur = (*cur)[s[i]];
++cur->w;
}
++cur->end;
}
void remove ( string s ) {
trie_node *cur = &root, *prev;
vector<trie_node*> del;
--cur->w;
for (int i = 0; i < s.size(); ++i) {
prev = cur;
cur = (*cur)[s[i]];
--cur->w;
if (cur->w == 0) {
(*prev)[s[i]] = NULL;
del.push_back(cur);
for (++i; i < s.size(); ++i) {
cur = (*cur)[s[i]];
del.push_back(cur);
}
}
}
for (int i = 0; i < del.size(); ++i)
delete del[i];
}
trie_node* find ( string s ) {
trie_node *cur = &root;
for (int i = 0; i < s.size(); ++i) {
if ((*cur)[s[i]] == NULL)
return &root;
cur = (*cur)[s[i]];
}
return cur;
}
int lcp ( string s ) {
trie_node *cur = &root;
for (int i = 0; i < s.size(); ++i) {
if ((*cur)[s[i]] == NULL)
return i;
cur = (*cur)[s[i]];
}
return s.size();
}
};
trie T;
int cod, ncod;
string cuv;
int main() {
fin >> ncod;
while (!fin.eof()) {
cod = ncod;
fin >> cuv >> ncod;
if (cod == 0) T.insert(cuv); else
if (cod == 1) T.remove(cuv); else
if (cod == 2) fout << T.find(cuv)->end << '\n'; else
if (cod == 3) fout << T.lcp(cuv) << '\n'; else
fout << "o.O\n";
}
}