不需要保存是否结束(isend),在插入时每经过一个节点,将该节点的计数器 +1,在查找时输出最后一个字符所在节点的cnt值即可;
PS:为什么加了删除树(del_Trie)会超时呢?
# include <cstdio> # include <cstring> # define LEN 10 + 1 struct node { int cnt; node * next[26]; node () { cnt = 0; memset(next, 0, sizeof(next)); } }; void insert_Trie(node *root, char *s) { int c; node *p = root; for (int i = 0; s[i]; ++i) { c = s[i]-'a'; if (p->next[c] == NULL) p->next[c] = new node; p = p->next[c]; ++(p->cnt); } } void build_Trie(node *root) { char s[LEN]; while (gets(s) , strcmp(s, "")) { insert_Trie(root, s); } } void del_Trie(node *p) { for (int i = 0; i < 26; ++i) if (p->next[i]) del_Trie(p->next[i]); del_Trie(p); } int search(node *root, char *s) { int c; node *p = root; for (; *s; ++s) { c = *s-'a'; if (p->next[c]) p = p->next[c]; else return 0; if ((*(s+1)) == 0) return p->cnt; } return 0; } void solve(void) { char s[LEN]; node *root = new node; build_Trie(root); while (gets(s) != NULL) { int ans = search(root, s); printf("%d\n", ans); } //del_Trie(root); //TLE } int main() { solve(); return 0; }