Pagini recente » Cod sursa (job #2935757) | Cod sursa (job #2744582) | Cod sursa (job #2919846) | Cod sursa (job #2563069) | Cod sursa (job #2319847)
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define SIGMA 26
#define MAX_LEN 20
using namespace std;
struct trieNode {
int cnt, fin;
trieNode* child[SIGMA];
};
trieNode* root;
trieNode* getNode() {
trieNode* node = (trieNode*)malloc(sizeof(trieNode));
node->cnt = node->fin = 0;
for(int i = 0; i < SIGMA; i++)
node->child[i] = NULL;
return node;
}
void insertWord(trieNode* root, char* word) {
trieNode* node = root;
int len = strlen(word);
for(int i = 0; i < len; i++) {
if(node->child[word[i] - 'a'] == NULL)
node->child[word[i] - 'a'] = getNode();
node = node->child[word[i] - 'a'];
++node->cnt;
}
++node->fin;
}
void deleteWord(trieNode* root, char* word) {
trieNode* node, *node2;
node = node2 = root;
int len = strlen(word);
for(int i = 0; i < len; i++) {
node2 = node->child[word[i] - 'a'];
--node2->cnt;
if(node2->cnt == 0)
node->child[word[i] - 'a'] = NULL;
if(node->cnt == 0)
free(node);
node = node2;
}
--node2->fin;
}
int searchWord(trieNode* root, char* word) {
trieNode* node = root;
int i = 0, len = strlen(word);
while(i < len && node->child[word[i] - 'a'] != NULL) {
node = node->child[word[i] - 'a'];
i++;
}
if(i == len)
return node->fin;
else return 0;
}
int searchPrefix(trieNode* root, char* word) {
trieNode* node = root;
int i = 0, len = strlen(word);
while(i < len && node->child[word[i] - 'a'] != NULL) {
node = node->child[word[i] - 'a'];
i++;
}
return i;
}
int main() {
char word[MAX_LEN+1];
int op;
FILE* fin, *fout;
fin = fopen("trie.in","r");
fout = fopen("trie.out","w");
root = getNode();
root->cnt = 1;
while(!feof(fin)) {
fscanf(fin,"%d %s\n",&op,word);
switch(op) {
case 0 :
insertWord(root,word);
break;
case 1 :
deleteWord(root,word);
break;
case 2 :
fprintf(fout,"%d\n",searchWord(root,word));
break;
case 3 :
fprintf(fout,"%d\n",searchPrefix(root,word));
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}