struct TrieNode {
enum { LETTERS_NUM = 26 };
bool hasString;
struct TrieNode* next[LETTERS_NUM];
TrieNode() : hasString(false) {
for (int i = 0; i < LETTERS_NUM; ++i)
next[i] = NULL;
}
};
void insert(TrieNode* root, string str) {
string::size_type i = 0;
TrieNode* ptr = root;
while (i < str.size()) {
if (!ptr->next[str[i] - 'a'])
ptr->next[str[i] - 'a'] = new TrieNode();
ptr = ptr->next[str[i] - 'a'];
i++;
}
ptr->hasString = true; // 允许空字符串
}
bool search(TrieNode* root, string str) {
string::size_type i = 0;
TrieNode* ptr = root;
while (i < str.size()) {
if (!ptr->next[str[i] - 'a'])
return false;
else
ptr = ptr->next[str[i] - 'a'];
i++;
}
return ptr->hasString;
}