Pagini recente » Cod sursa (job #1019044) | Cod sursa (job #2579428) | Cod sursa (job #882508) | Cod sursa (job #885191) | Cod sursa (job #3165895)
#include <bits/stdc++.h>
using namespace std;
struct node {
node *f[26];
int cnt, in_cuv;
node() {
cnt = 0;
in_cuv = 0;
for(char i = 'a'; i <= 'z'; i ++) {
f[i] = NULL;
}
}
};
void update(node *root, string &s, int add) {
node *curr = root;
for(auto it : s) {
if(curr->f[it - 'a'] == NULL) {
curr->f[it - 'a'] = new node;
}
curr->in_cuv += add;
curr = curr->f[it - 'a'];
}
curr->cnt += add;
}
int nr(node *root, string &s) {
node *curr = root;
for(auto it : s) {
if(curr->f[it - 'a'] == NULL) {
return 0;
}
curr = curr->f[it - 'a'];
}
return curr->cnt;
}
int max_pref(node *root, string &s) {
node *curr = root;
int i = 0;
for(auto it : s) {
if(curr->f[it - 'a'] == NULL) {
return i;
}
if(curr->f[it - 'a']->in_cuv < 1) {
return i + 1;
}
i ++;
curr = curr->f[it - 'a'];
}
return i;
}
int main() {
ifstream cin("trie.in");
ofstream cout("trie.out");
node *root = new node;
int cer;
string s;
while(cin >> cer >> s) {
if(cer == 0) {
update(root, s, 1);
} else if(cer == 1) {
update(root, s, -1);
} else if(cer == 2) {
cout << nr(root, s) << '\n';
} else {
cout << max_pref(root, s) << '\n';
}
}
return 0;
}