Pagini recente » Cod sursa (job #198395) | Cod sursa (job #537581) | Cod sursa (job #772886) | Cod sursa (job #10113) | Cod sursa (job #2885530)
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long double, pii> muchie;
const ll NMAX = 150001;
const ll VMAX = 26;
const ll INF = (1LL << 55);
const ll MOD = 90000000000000001;
const ll BLOCK = 1000000;
const ll base = 1000000001;
const ll nr_of_bits = 1000;
struct Node{
int pref, val;
int nxt[26];
void init(){
pref = val = 0;
for(int i = 0; i < 26; i++)
nxt[i] = -1;
}
}trie[NMAX * 20];
int cnt = 0;
int root;
string my;
void baga(int node, int k){
if(k == my.size()){
trie[node].val++;
trie[node].pref++;
return;
}
int c = my[k] - 'a';
trie[node].pref++;
if(trie[node].nxt[c] == -1){
trie[++cnt].init();
trie[node].nxt[c] = cnt;
}
baga(trie[node].nxt[c], k + 1);
}
void sterge(int node, int k){
if(k == my.size()){
trie[node].val--;
trie[node].pref--;
return;
}
int c = my[k] - 'a';
trie[node].pref--;
if(trie[node].nxt[c] == -1){
trie[++cnt].init();
trie[node].nxt[c] = cnt;
}
sterge(trie[node].nxt[c], k + 1);
}
int numara(int node, int k){
if(k == my.size()){
return trie[node].val;
}
int c = my[k] - 'a';
if(trie[node].nxt[c] == -1){
trie[++cnt].init();
trie[node].nxt[c] = cnt;
}
return numara(trie[node].nxt[c], k + 1);
}
int lp(int node, int k){
if(k == my.size()){
return k;
}
int c = my[k] - 'a';
if(trie[node].nxt[c] == -1 || trie[trie[node].nxt[c]].pref == 0){
return k;
}
return lp(trie[node].nxt[c], k + 1);
}
int main() {
ifstream cin("trie.in");
ofstream cout("trie.out");
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
trie[0].init();
int c;
string s;
int cnt = 0;
while(cin >> c && cin >> s){
if(c == 0){
my = s;
baga(0, 0);
}else if(c == 1){
my = s;
sterge(0, 0);
}else if(c == 2){
my = s;
cout << numara(0, 0) << "\n";
}else{
my = s;
cout << lp(0, 0) << "\n";
}
}
return 0;
}