Pagini recente » Cod sursa (job #1986980) | Cod sursa (job #2356972) | Cod sursa (job #1500769) | Cod sursa (job #1311743) | Cod sursa (job #2081192)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int n, tip, sol;
struct node{
int info, ok;
node *v[26];
}*r;
char sir[30];
void init(node *r){
r->ok = 0;
r->info = 0;
for(int i = 0; i <= 26; ++ i)
r->v[i] = NULL;
}
void add(node *&r, int poz){
if(r == NULL){
r = new node;
init(r);
}
if(poz == n + 1){
++ r->info;
return;
}
++ r->ok;
add(r->v[sir[poz] - 'a'], poz + 1);
}
void rmv(node *&r, int poz){
if(poz == n + 1){
-- r->info;
if(r->info == 0 && r->ok == 0){
delete r;
r = NULL;
}
return;
}
-- r->ok;
rmv(r->v[sir[poz] - 'a'], poz + 1);
node *nd = r->v[sir[poz] - 'a'];
if(r->ok == 0 && r->info == 0){
delete nd;
r->v[sir[poz] - 'a'] = NULL;
}
}
void cnt(node *r, int poz){
if(poz == n + 1){
sol = r->info;
return;
}
if(r->v[sir[poz] - 'a'] == NULL){
sol = 0;
return;
}
cnt(r->v[sir[poz] - 'a'], poz + 1);
}
void lng(node *r, int poz){
if(r->v[sir[poz] - 'a'] == NULL || poz == n){
sol = poz;
return;
}
lng(r->v[sir[poz] - 'a'], poz + 1);
}
int main()
{
r = NULL;
while(f>>tip){
f>>sir + 1;
n = strlen(sir + 1);
switch(tip){
case 0: add(r, 1); break;
case 1: rmv(r, 1); break;
case 2: sol = 0; cnt(r, 1); g<<sol<<'\n'; break;
case 3: sol = 0; lng(r, 1); g<<sol<<'\n'; break;
}
}
return 0;
}