Pagini recente » Cod sursa (job #3165524) | Cod sursa (job #1859499) | Cod sursa (job #2153227) | Cod sursa (job #1145588) | Cod sursa (job #2081587)
#include <fstream>
#include <string>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int n, tip;
char sir[100];
struct node{
int info, ok;
node *v[26];
node(){
info = ok = 0;
for(int i = 0; i <= 25; ++ i)
v[i] = 0;
}
}*root;
void add(node *&r, char *poz){
if(*poz == 0){
++ r->info;
return;
}
if(r->v[*poz - 'a'] == NULL){
r->v[*poz - 'a'] = new node;
++ r->ok;
}
add(r->v[*poz - 'a'], poz + 1);
}
void rmv(node *&r, char *poz){
if(*poz == 0){
-- r->info;
if(r->info == 0 && r->ok == 0 && r != root){
delete r;
r = NULL;
}
return;
}
rmv(r->v[*poz - 'a'], poz + 1);
if(r->v[*poz - 'a'] == NULL){
-- r->ok;
if(r->ok == 0 && r->info == 0 && r != root){
delete r;
r = NULL;
}
}
}
int cnt(node *r, char *poz){
if(*poz == 0)
return r->info;
if(r->v[*poz - 'a'] == NULL)
return 0;
return cnt(r->v[*poz - 'a'], poz + 1);
}
int lung(node *r, char *poz){
if(r->v[*poz - 'a'] == NULL || *poz == 0)
return 0;
return 1 + lung(r->v[*poz - 'a'], poz + 1);
}
int main()
{
root = new node;
while(f>>tip){
f>>sir;
switch (tip){
case 0: add(root, sir); break;
case 1: rmv(root, sir); break;
case 2: g<<cnt(root, sir)<<'\n'; break;
case 3: g<<lung(root, sir)<<'\n'; break;
}
}
return 0;
}