Pagini recente » Cod sursa (job #2107148) | Cod sursa (job #732290) | Cod sursa (job #1072190) | Cod sursa (job #74693) | Cod sursa (job #2203650)
// https://goo.gl/fBmFxu
#include <bits/stdc++.h>
using namespace std;
#define NMAX 100009
#define MMAX 200009
#define kInf (1 << 30)
#define kInfLL (1LL << 60)
#define kMod 666013
#define edge pair<int, int>
#define x first
#define y second
#define USE_FILES "MLC"
#ifdef USE_FILES
#define cin fin
#define cout fout
ifstream fin("trie.in");
ofstream fout("trie.out");
#endif
// number of tests from "in"
int test_cnt = 1;
void clean_test();
// your global variables are here
#define CH(c)(c - 'a')
template <int ALPHA = 26>
struct Trie {
Trie *son[ALPHA];
int areHere, endsHere;
Trie() {
areHere = endsHere = 0;
memset(son, 0, sizeof(son));
}
~Trie() {
for (int i = 0; i < ALPHA; ++i) {
if (son[i] != NULL) {
delete son[i];
}
}
}
void insert(char *s) {
Trie *node = this;
++node-> areHere;
for (int i = 0; s[i]; ++i) {
int x = s[i] - 'a';
if (!node->son[x]) {
node->son[x] = new Trie();
}
node = node->son[x];
++node->areHere;
}
++node->endsHere;
}
void remove(char *s) {
Trie *node = this;
--node->areHere;
for (int i = 0; s[i]; ++i) {
int x = s[i] - 'a' ;
if (!node->son[x]) {
return;
}
node = node->son[x];
--node->areHere;
}
--node->endsHere;
if (node->endsHere < 0 )
node -> endsHere = 0;
}
int search(char *s) {
Trie *node = this;
for (int i = 0; s[i]; ++i) {
int x = s[i] - 'a' ;
if (!node->son[x]) {
return 0;
}
node =node->son[x];
}
return node->endsHere;
}
int lcp(char *s) {
Trie *node = this;
int i;
for (i = 0; s[i]; ++i) {
int x = s[i] - 'a' ;
if (!node->son[x] ) {
return i;
}
node = node->son[x];
if (!node->areHere) {
return i;
}
}
return i;
}
};
// your solution is here
void solve() {
Trie<> *T = new Trie<>();
int op;
string word;
while (cin >> op) {
cin >> word;
char *s = (char * )word.c_str();
switch(op) {
case 0:
T->insert(s);
break;
case 1:
T->remove(s);
break;
case 2:
cout << T->search(s) << '\n';
break;
case 3:
cout << T->lcp(s) << '\n';
break;
default:
break;
}
}
delete T;
if (test_cnt > 0) {
clean_test();
}
}
void clean_test() {
// clean if needed
}
int main() {
// cin >> test_cnt;
while (test_cnt--) {
solve();
}
return 0;
}