Pagini recente » Cod sursa (job #179728) | Cod sursa (job #52493) | Cod sursa (job #2895810) | Cod sursa (job #3217968) | Cod sursa (job #2866351)
#include <bits/stdc++.h>
using namespace std;
namespace Trie {
struct Trie {
int cnt, ends;
Trie* v[26];
Trie() {
cnt = 0;
ends = 0;
memset(v, 0, sizeof(v));
}
};
using ts = Trie*;
ts root = new Trie;
void insert(ts node, char *s) {
if(s[0] == '\n' - 'a') {
node -> cnt++;
return;
}
if(node -> v[s[0]] == 0)
node -> ends++, node -> v[s[0]] = new Trie;
insert(node -> v[s[0]], s + 1);
}
bool erase(ts node, char *s) {
if(s[0] == '\n' - 'a') {
node -> cnt--;
}
else if(erase(node -> v[s[0]], s + 1)) {
node -> ends--;
node -> v[s[0]] = 0;
}
if(node -> cnt == 0 && node -> ends == 0 && node != root) {
delete node;
return 1;
}
return 0;
}
int query(ts node, char *s) {
if(s[0] == '\n' - 'a')
return node -> cnt;
if(node -> v[s[0]] != 0)
return query(node -> v[s[0]], s + 1);
return 0;
}
int maxx;
void lcp(ts node, char *s) {
maxx++;
if(s[0] == '\n' - 'a')
return;
if(node -> v[s[0]])
lcp(node -> v[s[0]], s + 1);
return;
}
};
#define cin fin
#define cout fout
ifstream cin("trie.in");
ofstream cout("trie.out");
char s[65];
int main() {
int cer;
char ch;
while(cin >> cer) {
cin.get();
int ptr = 0;
do {
ch = cin.get();
s[ptr++] = ch - 'a';
} while(ch != '\n');
if(cer == 0)
Trie::insert(Trie::root, s);
if(cer == 1)
Trie::erase(Trie::root, s);
if(cer == 2)
cout << Trie::query(Trie::root, s) << '\n';
if(cer == 3)
Trie::maxx = -1, Trie::lcp(Trie::root, s), cout << Trie::maxx << '\n';
}
}