Pagini recente » Cod sursa (job #48862) | Cod sursa (job #2440662) | Cod sursa (job #1527053) | Cod sursa (job #2333355) | Cod sursa (job #541119)
Cod sursa(job #541119)
// http://infoarena.ro/problema/trie
#include <fstream>
using namespace std;
#define maxLetters 26
#define maxSize 22
#define character (*word - 'a')
ifstream in("trie.in");
ofstream out("trie.out");
struct trie {
int counter;
int sons;
trie *son[maxLetters];
trie() {
counter = sons = 0;
memset(son,0,sizeof(son));
}
};
char currentWord[maxSize];
trie *root = new trie;
// adauga o aparitia a cuvantului word
void insert(trie *node,char *word);
// sterge o aparitie a cuvantului word
bool erase(trie *node,char *word);
// returneaza numarul de aparitii al cuvantului word
int query(trie *node,char *word);
// returneaza lungimea celui mai lung prefix comun a
// cuvantului word cu oricare alt cuvant din in lista
int prefix(trie *node,char *word,int length);
int main() {
int type;
for(;;) {
in >> type >> currentWord;
if(in.eof())
break;
switch(type) {
case 0: { insert(root,currentWord); break; }
case 1: { erase(root,currentWord); break; }
case 2: { out << query(root,currentWord) << "\n"; break; }
case 3: { out << prefix(root,currentWord,0) << "\n"; break; }
}
}
in.close();
out.close();
return (0);
}
void insert(trie *node,char *word) {
// daca s-a ajuns la finalul cuvantului
if(*word == 0) {
// creste numarul de aparitii al cuvantului
node->counter++;
return;
}
// daca nu are fii
if(!node->son[character]) {
// cream unul
node->son[character] = new trie;
// crestem numarul de fii ai nodului curent
node->sons++;
}
// inseram urmatoarea litera
insert(node->son[character],word+1);
}
bool erase(trie *node,char *word) {
// daca s-a ajuns la finalul cuvantului
if(*word == 0)
// scadem numarul de aparitii al cuvantului
node->counter--;
else
// daca cuvantul nu mai exista
// (s-a sters singura sa aparitie)
if( erase(node->son[character],word+1) ) {
node->son[character] = 0;
node->sons--;
}
// daca nu mai exista alte aparitii ale
// cuvantului (acesta este ultima)
if(!node->counter && !node->sons && node != root) {
// se sterge cuvantul
delete node;
// nu mai exista cuvantul
return true;
}
// cuvantul inca mai exista
// (mai are aparitii)
return false;
}
int query(trie *node,char *word) {
// daca s-a ajuns la finalul cuvantului
if(*word == 0)
// returneaza numarul de aparitii
return node->counter;
if(node->son[character])
return query(node->son[character],word+1);
return (0);
}
int prefix(trie *node,char *word,int length) {
// a doua conditie este pentru posibilitatea
// ca word sa nu fie in lista
if(*word == 0 || !node->son[character])
return length;
else
return prefix(node->son[character],word+1,length+1);
}