Pagini recente » Cod sursa (job #1214796) | Cod sursa (job #716839) | Cod sursa (job #1159146) | Cod sursa (job #1661900) | Cod sursa (job #2325770)
#include <fstream>
using namespace std;
ifstream in ("trie.in");
ofstream out("trie.out");
int n, type;
char word[30];
struct node{
int freq;
int wordEnd;
node* letters[26];
node(){
for(int i = 0; i < 26; ++ i)
letters[i] = NULL;
freq = 0;
wordEnd = 0;
}
};
node* root;
void addWord(node* nodeCurr, char* c){
if(nodeCurr -> letters[*c - 'a'] == NULL){
nodeCurr -> letters[*c - 'a'] = new node;
}
++ nodeCurr -> freq;
if(*c == 0)
++ nodeCurr -> wordEnd;
if(*c != 0)
addWord(nodeCurr -> letters[*c - 'a'], c + 1);
}
void deleteWord(node* nodeCurr, char* c){
-- nodeCurr -> freq;
if(c == 0){
-- nodeCurr -> wordEnd;
}
if(*c != 0 && nodeCurr -> letters[*c - 'a'] != NULL){
deleteWord(nodeCurr -> letters[*c - 'a'], c + 1);
if(nodeCurr -> letters[*c - 'a'] -> freq == 0){
delete nodeCurr -> letters[*c - 'a'];
nodeCurr -> letters[*c - 'a'] = NULL;
}
}
}
int cntFreq(node* nodeCurr, char* c){
if(*c != 0 && nodeCurr -> letters[*c - 'a'] != NULL)
return cntFreq(nodeCurr -> letters[*c - 'a'], c + 1);
if(*c == 0)
return nodeCurr -> wordEnd;
return 0;
}
int cntLength(node* nodeCurr, char* c, int lg){
if(nodeCurr -> freq < 2)
return lg;
if(*c != 0 && nodeCurr -> letters[*c - 'a'] != NULL)
return cntLength(nodeCurr -> letters[*c - 'a'], c + 1, lg + 1);
return lg;
}
int main(int argc, const char * argv[]) {
root = new node;
while(in>>type){
in>>word;
switch (type) {
case 0:
addWord(root, word);
break;
case 1:
deleteWord(root, word);
break;
case 2:
out<<cntFreq(root, word)<<'\n';
break;
case 3:
out<<cntLength(root, word, 0)<<'\n';
break;
}
}
return 0;
}