Pagini recente » Cod sursa (job #2829342) | Cod sursa (job #2569925) | Cod sursa (job #746623) | Cod sursa (job #1874900) | Cod sursa (job #2150580)
#include<fstream>
#include<string>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int ALPHSZ = 26;
struct trie{
trie* lettersList[ALPHSZ] = {0};
int wordFreq = 0, hashSize = 0;
};
inline int hashedChar(char a){
return a - 'a';
}
trie* root = new trie;
void insertWord(trie* node, char* word){
if(*word == '\0')
++(node -> wordFreq);
else if(node -> lettersList[hashedChar(*word)])
insertWord(node -> lettersList[hashedChar(*word)], word + 1);
else{
trie* newNode = new trie;
node -> lettersList[hashedChar(*word)] = newNode;
++(node -> hashSize);
insertWord(node -> lettersList[hashedChar(*word)], word + 1);
}
}
bool deleteWord(trie* node, char* word){
if(*word == '\0')
--(node -> wordFreq);
else if(deleteWord(node -> lettersList[hashedChar(*word)], word + 1)){
node -> lettersList[hashedChar(*word)] = 0;
--(node -> hashSize);
}
if(node -> wordFreq == 0 and node != root and node -> hashSize == 0){
delete node;
return true;
}
return false;
}
int wordFrequency(trie* node, char* word){
if(*word == '\0')
return node -> wordFreq;
if(node -> lettersList[hashedChar(*word)])
return wordFrequency(node -> lettersList[hashedChar(*word)], word + 1);
else
return 0;
}
int longestPrefix(trie* node, char* word){
if(*word == '\0')
return 0;
if(node -> lettersList[hashedChar(*word)])
return 1 + longestPrefix(node -> lettersList[hashedChar(*word)], word + 1);
else
return 0;
}
int main(){
int code;
char word[ALPHSZ];
while(fin >> code >> word){
if(code == 0)
insertWord(root, word);
else if(code == 1)
deleteWord(root, word);
else if(code == 2)
fout << wordFrequency(root, word) << '\n';
else if(code == 3)
fout << longestPrefix(root, word) << '\n';
}
}