Untitled
unknown
plain_text
a year ago
1.5 kB
12
Indexable
struct TrieNode
{
struct TrieNode *children[bit_size];
// isEndOfWord is true if the node represents
// end of a word
bool isEndOfWord;
};
// Returns new trie node (initialized to NULLs)
struct TrieNode *getNode(void)
{
struct TrieNode *pNode = new TrieNode;
pNode->isEndOfWord = false;
for (int i = 0; i < 2; i++)
pNode->children[i] = NULL;
return pNode;
}
// If not present, inserts key into trie
// If the key is prefix of trie node, just
// marks leaf node
void Insert(struct TrieNode *root, string key)
{
struct TrieNode *pCrawl = root;
for (int i = key.length() - 1; i >= 0; i--)
{
int index = key[i] - '0';
if (pCrawl->children[index] == NULL)
pCrawl->children[index] = getNode();
pCrawl = pCrawl->children[index];
}
// mark last node as leaf
pCrawl->isEndOfWord = true;
}
// Returns true if key presents in trie, else
// false
typedef long long ll;
long long Search(struct TrieNode *root, string key)
{
struct TrieNode *pCrawl = root;
ll res = 0;
for (int i = key.length() - 1; i >= 0; i--)
{
int index = key[i] - '0';
int deg = i;
if (pCrawl->children[(index + 1) % 2] != NULL){
res += (1LL << deg);
pCrawl = pCrawl->children[(index + 1) % 2];
}
else
{
pCrawl = pCrawl->children[index];
}
// cout << res << '\n';
}
return res;
}Editor is loading...
Leave a Comment