Pagini recente » Cod sursa (job #1075926) | Cod sursa (job #1188666) | Cod sursa (job #2087390) | Cod sursa (job #1767732) | Cod sursa (job #2338217)
#include <fstream>
#include <cstring>
#define ch (*s - 'a')
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
int n, t;
char s[25];
struct Trie {
int val, nr;
Trie* nxt[26];
Trie() {
val = nr = 0;
for(int i = 0; i < 26; i++)
nxt[i] = 0;
}
} *R;
void insert(Trie* T, char *s) {
if(*s == NULL) {
T->val++;
return;
}
if(T->nxt[ch] == 0) {
T->nxt[ch] = new Trie;
T->nr++;
}
insert(T->nxt[ch], s + 1);
}
int erase(Trie *T, char *s) {
if(*s == NULL)
T->val--;
else if(erase(T->nxt[ch], s + 1)) {
T->nxt[ch] = 0;
T->nr--;
}
if(!T->val && !T->nr && T != R) {
delete T; return 1;
}
return 0;
}
int query(Trie* T, char *s) {
if(*s == NULL)
return T->val;
if(T->nxt[ch])
return query(T->nxt[ch], s + 1);
return 0;
}
int lcp(Trie* T, char *s, int lg) {
if(*s == NULL || T->nxt[ch] == 0)
return lg;
return lcp(T->nxt[ch], s + 1, lg + 1);
}
int main() {
R = new Trie;
while(cin >> t >> s) {
if(t == 0)
insert(R, s);
else if(t == 1)
erase(R, s);
else if(t == 2)
cout << query(R, s) << "\n";
else
cout << lcp(R, s, 0) << "\n";
}
return 0;
}