Pagini recente » Cod sursa (job #1754313) | Cod sursa (job #200398) | Cod sursa (job #72484) | Cod sursa (job #1164372) | Cod sursa (job #2149463)
#include<fstream>
#include<unordered_map>
#include<cstring>
#include<stack>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
unordered_map<char, trie*> lettersList;
int wordFreq = 0;
};
trie* root = new trie;
inline void insertWord(char word[]){
unordered_map<char, trie*> :: iterator letterPos;
int wordLen = strlen(word), idx;
trie* node = root;
for(idx = 0; idx < wordLen; ++idx){
letterPos = (node -> lettersList).find(word[idx]);
if(letterPos == (node -> lettersList).end()){
trie* newNode = new trie;
(node -> lettersList).insert({word[idx], newNode});
node = newNode;
}
else
node = letterPos -> second;
}
++(node -> wordFreq);
}
inline void deleteWord(char word[]){
stack<trie*> Stack;
trie* node = root;
int wordLen = strlen(word), idx;
unordered_map<char, trie*> :: iterator letterPos;
for(idx = 0; idx < wordLen; ++idx){
Stack.push(node);
letterPos = (node -> lettersList).find(word[idx]);
node = letterPos -> second;
}
--(node -> wordFreq);
for(idx = wordLen - 1; node -> wordFreq == 0 and (node -> lettersList).empty() and idx >= 0; --idx){
delete node;
node = Stack.top();
Stack.top();
(node -> lettersList).erase((node -> lettersList).find(word[idx]));
}
}
inline int wordFrequency(char word[]){
int idx, wordLen = strlen(word);
trie* node = root;
unordered_map<char, trie*> :: iterator letterPos;
for(idx = 0; idx < wordLen; ++idx){
letterPos = (node -> lettersList).find(word[idx]);
if(letterPos == (node -> lettersList).end())
return 0;
else
node = letterPos -> second;
}
return (node -> wordFreq);
}
inline int get_prefixLen(char word[]){
int prefixLen = 0, wordLen = strlen(word), idx;
trie* node = root;
unordered_map<char, trie*> :: iterator letterPos;
for(idx = 0; idx < wordLen; ++idx){
letterPos = (node -> lettersList).find(word[idx]);
if(letterPos == (node -> lettersList).end())
return prefixLen;
else{
++prefixLen;
node = letterPos -> second;
}
}
return prefixLen;
}
int main(){
int code;
char word[25];
(root -> lettersList).insert({'>', NULL});
while(fin >> code >> word){
if(code == 0)
insertWord(word);
// else if(code == 1)
// deleteWord(word);
else if(code == 2)
fout << wordFrequency(word) << '\n';
else if(code == 3)
fout << get_prefixLen(word) << '\n';
}
}