Pagini recente » Cod sursa (job #408402) | Cod sursa (job #899113) | Cod sursa (job #2709369) | Cod sursa (job #580059) | Cod sursa (job #1245818)
#include <cstdio>
#include <cstring>
#include <cstdlib>
char s[23];
struct Trie{
int numberOfWords;
int numberOfSons;
Trie* nextNode[26];
Trie(){
numberOfSons = 0;
numberOfWords = 0;
memset(nextNode,0,sizeof(nextNode));
}
};
Trie* ROOT = new Trie;
void insertWord(Trie* root, char* str){
if(*str == '\n'){
++root->numberOfWords;
return;
}
if(root->nextNode[*str - 'a'] == 0){
root->nextNode[*str - 'a'] = new Trie;
++root->numberOfSons;
}
insertWord(root->nextNode[*str - 'a'], str+1);
}
bool deleteNode(Trie* root, char* str){
if(*str == '\n')
--root->numberOfWords;
else if(deleteNode(root->nextNode[*str - 'a'], str+1)){
root->nextNode[*str - 'a'] = 0;
--root->numberOfSons;
}
if(root->numberOfWords == 0 && root->numberOfSons == 0 && root != ROOT){
delete root;
return 1;
}
return 0;
}
int wordApp(Trie* root, char* str){
if(*str == '\n')
return root->numberOfWords;
if(root->nextNode[*str - 'a'])
return wordApp(root->nextNode[*str - 'a'], str+1);
return 0;
}
int largestPrefix(Trie* root, char* str, int maxPrefix){
if(*str == '\n' || root->nextNode[*str - 'a'] == 0)
return maxPrefix;
return largestPrefix(root->nextNode[*str - 'a'], str+1, maxPrefix+1);
}
int main(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(s,23,stdin);
while(!feof(stdin)){
switch(s[0]){
case '0': insertWord(ROOT, s+2);
break;
case '1': deleteNode(ROOT, s+2);
break;
case '2': printf("%d\n", wordApp(ROOT, s+2));
break;
case '3': printf("%d\n", largestPrefix(ROOT, s+2, 0));
break;
}
fgets(s,23,stdin);
}
return 0;
}