Pagini recente » Cod sursa (job #2436718) | Rating Rusu Luca (Alexinfo22) | Cod sursa (job #384040) | Cod sursa (job #3280968) | Cod sursa (job #1649708)
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
char sir[25];
int com, lung;
struct trie {
int sons, count;
trie *fiu[26];
trie() {
count = 0, sons = 0;
for(int i = 0; i < 26; ++i) fiu[i] = 0;
}
};
trie *root = new trie;
void insert(trie *node, int pos){
int ind;
if(pos == lung)
node -> count++;
else {
ind = (int)(sir[pos] - 'a');
if(!(node -> fiu[ind])){
node -> fiu[ind] = new trie;
node -> sons++;
}
insert(node -> fiu[ind], pos + 1);
}
}
int sterge(trie *node, int pos){
int deleted, ind;
if(pos == lung){
node -> count--;
}
else {
ind = (int)(sir[pos] - 'a');
deleted = sterge(node -> fiu[ind], pos + 1);
if(deleted){
node -> sons--;
node -> fiu[ind] = 0;
}
}
if(!(node -> count) && node != root && !(node -> sons)){
delete node; return 1;
}
return 0;
}
int result;
int longest_prefix(trie *node, int pos){
int ind;
if(pos < lung){
ind = (int)(sir[pos] - 'a');
if(node -> fiu[ind]){
result++;
longest_prefix(node -> fiu[ind], pos + 1);
}
}
return result;
}
int how_many_times(trie *node, int pos){
int ind;
if(pos == lung)
return node -> count;
ind = (int)(sir[pos] - 'a');
if(node -> fiu[ind])
how_many_times(node -> fiu[ind], pos + 1);
else return 0;
}
int main()
{
int x;
while(in >> com){
in.get();
in.get(sir, 22);
lung = strlen(sir);
if(com == 0)
insert(root, 0);
if(com == 1)
com = sterge(root, 0);
if(com == 2)
out<<how_many_times(root, 0);
if(com == 3)
out<<longest_prefix(root, 0);
if(com >= 2) out<<"\n";
result = 0;
}
in.close();
out.close();
return 0;
}