Pagini recente » Cod sursa (job #1349780) | Cod sursa (job #1786635) | Cod sursa (job #1866320) | Cod sursa (job #1056264) | Cod sursa (job #1742181)
#include <bits/stdc++.h>
#define NMax 35
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie{
int words;
int prefixes;
Trie *edge[26];
Trie(){
words = 0;
prefixes = 0;
memset(edge,0,sizeof(edge));
}
};
Trie *root = new Trie;
void addWord(Trie *node, char *w){
if(*w == '\0'){
node->words++;
return;
}
if(node->edge[*w - 'a'] == 0){
node->edge[*w - 'a'] = new Trie;
node->prefixes++;
}
addWord(node->edge[*w - 'a'],w + 1);
}
int delWord(Trie *node, char *w){
if(*w == '\0'){
node->words--;
}else
if(delWord(node->edge[*w - 'a'],w + 1)){
node->prefixes--;
node->edge[*w - 'a'] = 0;
}
if(node->words == 0 && node->prefixes == 0 && node != root){
delete node;
return 1;
}
return 0;
}
int queWord(Trie *node, char *w){
if(*w == '\0'){
return node->words;
}else{
if(node->edge[*w - 'a'] == 0){
return 0;
}else
return queWord(node->edge[*w - 'a'],w + 1);
}
}
int preWord(Trie *node, char *w){
if(*w == '\0' || node->edge[*w - 'a'] == 0)
return 0;
return 1 + preWord(node->edge[*w - 'a'], w + 1);
}
int main()
{
char line[NMax];
while(f.getline(line,NMax)){
if(line[0] == '0') addWord(root,line + 2);
if(line[0] == '1') delWord(root,line + 2);
if(line[0] == '2') g << queWord(root,line + 2) << '\n';
if(line[0] == '3') g << preWord(root,line + 2) << '\n';
}
return 0;
}