Pagini recente » Cod sursa (job #2066721) | Cod sursa (job #2828729) | Cod sursa (job #1261237) | Cod sursa (job #1295588) | Cod sursa (job #1278709)
#include<stdio.h>
#include<string.h>
#include<iostream>
#define SIGMA 30
#define Nmax 25
using namespace std;
struct node
{
node()
{
nr = total = 0;
memset(children, NULL, sizeof(children));
}
int nr, total;
node *children[SIGMA];
};
void insert(node *p, char *s)
{
++p->total;
if(*s == '\n' || *s == NULL)
{
++p->nr;
return;
}
int code = *s - 'a';
if(p->children[code] == NULL)
p->children[code] = new node();
insert(p->children[code], s+1);
}
void remove(node *p, char *s)
{
--p->total;
if(*s == '\n' || *s == NULL)
{
--p->nr;
return;
}
int code = *s - 'a';
remove(p->children[code], s+1);
}
int count(node *p, char *s)
{
if(*s == '\n' || *s == NULL)
{
return p->nr;
}
int code = *s - 'a';
if(p->children[code] == NULL)
return 0;
return count(p->children[code], s+1);
}
int prefix(node *p, char *s)
{
if(*s == '\n' || *s == NULL)
return 0;
int code = *s - 'a';
if(p->children[code] == NULL || p->children[code]->total == 0)
return 0;
return 1 + prefix(p->children[code], s+1);
}
void solve(node *R)
{
FILE*f = fopen("trie.in", "r");
FILE*g = freopen("trie.out", "w", stdout);
char p[25];
int cnt = 0;
while(!feof(f))
{
fgets(p, Nmax, f);
if(feof(f))
continue;
if(p[0] == '0')
insert(R, p+2);
else if(p[0] == '1')
remove(R, p+2);
else if(p[0] == '2')
cout<<count(R, p+2)<<"\n";
else if(p[0] == '3')
cout<<prefix(R, p+2)<<"\n";
}
fclose(f);
}
int main()
{
node *R = new node;
solve(R);
return 0;
}