Pagini recente » Cod sursa (job #1248873) | Cod sursa (job #1496348) | Cod sursa (job #2945287) | Cod sursa (job #938618) | Cod sursa (job #2450436)
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
const int DICT_SIZE = 26; ///dictionary size
const int MAX_LEN = 22;
class Trie{
private:
int cnt; ///cate cuv au ajuns aici
int nrFii; ///cati fii are nodul crt
bool isRoot;
Trie *fiu[DICT_SIZE];
public:
Trie(bool root){
cnt = nrFii = 0;
for(int i=0;i<DICT_SIZE;i++)
fiu[i] = NULL;
isRoot = root;
}
void insertWord(Trie *node, char word[]){
if(word[0] == NULL){
node->cnt ++;
return;
}
int let = word[0] - 'a'; ///crt letter
///'open' a new path
if(node->fiu[let] == NULL){
node->fiu[let] = new Trie(false);
node->nrFii ++;
}
///recur for the next letter
insertWord(node->fiu[let], word + 1);
}
bool deleteWord(Trie *node, char word[]){
int let = word[0] - 'a';
if(word[0] == NULL)
node->cnt --;
else if(deleteWord(node->fiu[let], word + 1) == true){
node->fiu[let] = NULL;
node->nrFii --;
}
if(node->cnt == 0 && node->nrFii == 0 && node->isRoot == false){
delete node;
return true;
}
return false;
}
int getCount(Trie *node, char word[]){
if(word[0] == NULL)
return node->cnt;
int let = word[0] - 'a';
if(node->fiu[let])
return getCount(node->fiu[let], word + 1);
return 0;
}
int getPrefix(Trie *node, char word[], int len){
int let = word[0] - 'a';
if(node->fiu[let] == NULL || word[0] == NULL)
return len;
return getPrefix(node->fiu[let], word + 1, len + 1);
}
};
Trie *T = new Trie(true);
int main()
{
int q;
char cuv[MAX_LEN];
while(in>>q>>cuv){
if(q == 0)
T->insertWord(T, cuv);
else if(q == 1)
T->deleteWord(T, cuv);
else if(q == 2)
out<<T->getCount(T, cuv)<<"\n";
else
out<<T->getPrefix(T, cuv, 0)<<"\n";
}
in.close();
out.close();
return 0;
}