Pagini recente » Cod sursa (job #2905994) | Cod sursa (job #1522922) | Cod sursa (job #180474) | Cod sursa (job #439228) | Cod sursa (job #599034)
Cod sursa(job #599034)
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
#define MAX_N 26
int len;
typedef struct NODE {
int nWords;
int nPrefixes;
NODE *f[MAX_N];
NODE () {
nWords = 0;
nPrefixes = 0;
memset (f, 0, sizeof (f));
}
};
NODE* root;
void insertWord (NODE *act, char *word, int p) {
if (p == len) {
act->nWords++;
act->nPrefixes++;
} else {
act->nPrefixes++;
int i = word[p] - 'a';
if (act->f[i] == NULL)
act->f[i] = new NODE();
insertWord (act->f[i], word, p + 1);
}
}
void deleteWord (NODE *act, char *word, int p) {
if (p == len) {
--act->nWords;
--act->nPrefixes;
} else {
--act->nPrefixes;
int i = word[p] - 'a';
deleteWord (act->f[i], word, p + 1);
}
}
int countWords (NODE *act, char *word, int p) {
if (p == len) {
return act->nWords;
} else {
int i = word[p] - 'a';
if (act->f[i] == NULL) return 0;
return countWords(act->f[i], word, p + 1);
}
}
int longestPrefix (NODE *act, char *word, int p) {
if (p == len) {
return p;
} else {
int i = word[p] - 'a';
if (act->f[i] == NULL) return p;
if (act->f[i]->nPrefixes > 0)
return longestPrefix (act->f[i], word, p + 1);
else
return p;
}
}
int main () {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
root = new NODE();
int type;
char line[MAX_N];
while (scanf ("%d ", &type) != EOF) {
gets (line);
len = strlen (line);
if (type == 0) insertWord(root, line, 0);
if (type == 1) deleteWord(root, line, 0);
if (type == 2) printf ("%d\n", countWords(root, line, 0));
if (type == 3) printf ("%d\n", longestPrefix(root, line, 0));
}
return 0;
}