Pagini recente » Cod sursa (job #517869) | Cod sursa (job #2453285) | Cod sursa (job #1654936) | Cod sursa (job #627129) | Cod sursa (job #2338197)
#include <fstream>
#include <cstring>
#define ch(poz) (s[poz] - 'a')
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
char s[40];
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, int poz, int n) {
if(poz == n) {
T->val++;
return;
}
if(T->nxt[ch(poz)] == 0) {
T->nxt[ch(poz)] = new Trie;
T->nr++;
}
insert(T->nxt[ch(poz)], poz + 1, n);
}
int erase(Trie *T, int poz, int n) {
if(poz == n)
T->val--;
else if(erase(T->nxt[ch(poz)], poz + 1, n)) {
T->nxt[ch(poz)] = 0;
T->nr--;
}
if(!T->val && !T->nr && T != R) {
delete T; return 1;
}
return 0;
}
int query(Trie* T, int poz, int n) {
if(poz == n)
return T->val;
if(T->nxt[ch(poz)])
return query(T->nxt[ch(poz)], poz + 1, n);
return 0;
}
int lcp(Trie* T, int poz, int lg, int n) {
if(poz == n || T->nxt[ch(poz)] == 0)
return lg;
return lcp(T->nxt[ch(poz)], poz + 1, lg + 1, n);
}
int main() {
while(cin.getline(s, 31)) {
int n = strlen(s);
if(s[0] == '0')
insert(R, 2, n);
else if(s[0] == '1')
erase(R, 2, n);
else if(s[0] == '2')
cout << query(R, 2, n) << "\n";
else
cout << lcp(R, 2, 0, n) << "\n";
}
return 0;
}