Pagini recente » Cod sursa (job #1139772) | Cod sursa (job #2440635) | Cod sursa (job #45356) | Cod sursa (job #775265) | Cod sursa (job #3036684)
#include <fstream>
using namespace std;
struct node{
int value;
int nrC;
node *next[26];
node(){
value=0;
nrC=0;
for (int i=0;i<26;i++){
next[i]=NULL;
}
}
};
node *root;
void insertWord(char *c, node *currentNode){
if (*c!=0){
if (currentNode->next[*c-'a']==NULL){
currentNode->next[*c-'a']=new node;
currentNode->nrC++;
}
insertWord(c+1, currentNode->next[*c-'a']);
return;
}
currentNode->value++;
}
int countWord(char *c, node *currentNode){
if (*c!=0){
if (currentNode->next[*c-'a']==NULL){
return 0;
}
return countWord(c+1, currentNode->next[*c-'a']);
}
return currentNode->value;
}
void deleteWord(char *c, node *currentNode){
if (*c!=0){
if (currentNode->next[*c-'a']==NULL){
return;
}
deleteWord(c+1, currentNode->next[*c-'a']);
if (currentNode->next[*c-'a']->value==0&¤tNode->next[*c-'a']->nrC==0){
delete currentNode->next[*c-'a'];
currentNode->next[*c-'a']=NULL;
currentNode->nrC--;
}
return;
}
currentNode->value--;
}
int longestPrefix(char *c, node *currentNode){
if (*c==0){
return 0;
}
if (currentNode->next[*c-'a']==NULL){
return 0;
}
return 1+longestPrefix(c+1, currentNode->next[*c-'a']);
}
void deleteTrie(node *currentNode){
if (currentNode==NULL){
return;
}
for (int i=0;i<26;i++){
if (currentNode->next[i]!=NULL){
deleteTrie(currentNode->next[i]);
}
}
delete currentNode;
}
int op;
char w[22];
int main () {
ifstream fin ("trie.in");
ofstream fout("trie.out");
root=new node;
while (fin>>op>>w){
switch (op){
case 0:
insertWord(w, root);
break;
case 1:
deleteWord(w, root);
break;
case 2:
fout<<countWord(w, root)<<"\n";
break;
case 3:
fout<<longestPrefix(w, root)<<"\n";
break;
}
}
return 0;
}