Pagini recente » Cod sursa (job #2893138) | Cod sursa (job #557890) | Cod sursa (job #647531) | Cod sursa (job #989966) | Cod sursa (job #1005044)
#include <fstream>
#include <cstring>
using namespace std;
const int SIGMA = 26;
const int MAX_L = 25;
struct Trie {
short int freq, words;
Trie *sons[SIGMA];
Trie() {
for(int i = 0; i < SIGMA; ++i)
sons[i] = NULL;
words = freq = 0;
}
};
int t;
char S[MAX_L];
Trie *root = new Trie;
inline void insert(Trie *node, char S[], int len) {
for(int i = 0; i < len; ++i) {
int next = S[i] - 'a';
if(node->sons[next] == NULL)
node->sons[next] = new Trie;
node = node->sons[next];
++node->words;
}
++node->freq;
}
inline void erase(Trie *node, char S[], int len) {
for(int i = 0; i < len; ++i) {
int next = S[i] - 'a';
if(node->sons[next] == NULL)
node->sons[next] = new Trie;
node = node->sons[next];
--node->words;
}
--node->freq;
}
inline int search(Trie *node, char S[], int len) {
for(int i = 0; i < len; ++i) {
int next = S[i] - 'a';
if(node->sons[next] == NULL)
node->sons[next] = new Trie;
node = node->sons[next];
}
return node->freq;
}
inline int prefix(Trie *node, char S[], int len) {
int ans = 0;
for(int i = 0; i < len; ++i) {
int next = S[i] - 'a';
if(node->sons[next] && (node->sons[next])->words != 0) {
node = node->sons[next];
++ans;
}
else i = len;
}
return ans;
}
int main() {
ifstream f("trie.in");
ofstream g("trie.out");
while((f >> t >> S)) {
int len = strlen(S);
if(S[len-1] == '\n')
--len;
if(t == 0)
insert(root, S, len);
else if(t == 1)
erase(root, S, len);
else if(t == 2)
g << search(root, S, len) << "\n";
else g << prefix(root, S, len) << "\n";
}
f.close();
g.close();
return 0;
}