Pagini recente » Borderou de evaluare (job #1776777) | Borderou de evaluare (job #1898199) | Borderou de evaluare (job #3160991) | Borderou de evaluare (job #2002061) | Cod sursa (job #1800405)
#include <fstream>
#include <iostream>
#include <string.h>
using namespace std;
char buffer[25];
class Trie{
public:
int ap;
int sf;
Trie *node[26];
Trie();
};
Trie *root = new Trie;
Trie::Trie(){
ap = 0;
sf = 0;
for(int i = 0;i < 26;i++){
node[i] = NULL;
}
}
void add(){
int n = strlen(buffer + 1);
int i;
Trie *p = root;
for(i = 1;i <= n;i++){
if(p->node[buffer[i] - 'a'] == NULL){
Trie *ax = new Trie;
p->node[buffer[i] - 'a'] = ax;
}
p = p->node[buffer[i] - 'a'];
p->ap++;
if(i == n){
p->sf++;
}
}
}
void dfs(Trie *p, int depth, int n){
if(depth > n){
return;
}
p->ap--;
if(depth == n){
p->sf--;
}
if(depth < n){
dfs(p->node[buffer[depth + 1] - 'a'], depth + 1, n);
if(p->node[buffer[depth + 1] - 'a']->ap == 0){
delete p->node[buffer[depth+1] - 'a'];
p->node[buffer[depth+1] - 'a'] = NULL;
}
}
}
int countAp(){
int n = strlen(buffer + 1);
int i;
Trie *p = root;
for(i = 1;i <= n;i++){
if(p->node[buffer[i] - 'a'] != NULL){
p = p->node[buffer[i] - 'a'];
}else{
return 0;
}
}
return p->sf;
}
int calculatePref(){
int n = strlen(buffer + 1);
int i;
Trie *p = root;
for(i = 1;i <= n;i++){
if(p->node[buffer[i] - 'a'] != NULL){
p = p->node[buffer[i] - 'a'];
}else{
break;
}
}
return i-1;
}
int main(){
ifstream fin("trie.in");
ofstream fout("trie.out");
int x;
for(;fin>>x, fin>>buffer+1;){
if(x == 0){
add();
}else if(x == 1){
dfs(root->node[buffer[1] - 'a'], 1, strlen(buffer + 1));
if(root->node[buffer[1]-'a']->ap == 0){
delete root->node[buffer[1] - 'a'];
root->node[buffer[1]-'a'] = NULL;
}
}else if(x == 2){
fout<<countAp()<<'\n';
}else{
fout<<calculatePref()<<'\n';
}
}
return 0;
}