Pagini recente » Cod sursa (job #2282012) | Cod sursa (job #771077) | Cod sursa (job #570797) | Cod sursa (job #2580373) | Cod sursa (job #2173788)
#include<iostream>
#include<fstream>
#include <cstdio>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
int w_cnt;
int t_cnt;
trie *t[26];
trie()
{
w_cnt = 0;
t_cnt = 0;
memset(t,0,sizeof(t));
}
};
trie *t_node;
int char_to_int(char *c)
{
return int(*c)-97;
}
void add_w(trie *it,char *s)
{
if(*s == '\0')
{
it->w_cnt++;
return;
}
int poz = char_to_int(s);
if(it->t[poz] == 0) it->t[poz] = new trie,it->t_cnt++;
add_w(it->t[poz],s+1);
}
int delete_w(trie *it,char *s)
{
if(*s == '\0')
{
it->w_cnt--;
}
else if(delete_w(it->t[char_to_int(s)],s+1))
{
int poz = char_to_int(s);
it->t[poz] = 0;
it->t_cnt--;
}
if(it->t_cnt == 0 && it->w_cnt == 0 && it != t_node)
{
delete it;
return 1;
}
return 0;
}
int w_query(trie *it,char *s)
{
if(*s == '\0') return it->w_cnt;
int poz = char_to_int(s);
if(it->t[poz] != 0)
{
return w_query(it->t[poz],s+1);
}
return 0;
}
int prefix_query(trie *it,char *s,int k)
{
if(*s == '\0' || it->t[char_to_int(s)] == 0) return k;
return prefix_query(it->t[char_to_int(s)],s+1,k+1);
}
int main()
{
t_node = new trie;
int k1;
char cuv[21];
while(fin>>k1)
{
fin>>cuv;
if(k1 == 0) add_w(t_node,cuv);
else if(k1 == 1) delete_w(t_node,cuv);
else if(k1 == 2) fout<<w_query(t_node,cuv)<<"\n";
else if(k1 == 3) fout<<prefix_query(t_node,cuv,0)<<"\n";
}
}