#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define dbg(a) cout<son[*s-base]==NULL) //不存在 则建立 temp->son[*s-base]=NewTrie(); else temp->son[*s-base]->num++; temp=temp->son[*s-base]; s++; } temp->terminal=true; //到达尾部,标记一个串 } bool Search(Trie *root, char *s) { Trie *temp=root; while(*s) { if(temp->son[*s-base]!=NULL) temp=temp->son[*s-base]; else return false; s++; } return true; } void DeleteAll(Trie *root) //删除全部节点 { Trie *temp=root; for(int i=0; ison[i]!=NULL) DeleteAll(root->son[i]); } delete root; } bool DeleteWord(Trie *root,char *word) //删除某个单词 { Trie *current=root; stack nodes; //用来记录经过的中间节点,供以后自上而下的删除 while(*word && current!=NULL) { nodes.push(current); //经过的中间节点压栈 current=current->son[*word-base]; word++; } bool del = 1; if(current) //此时current指向该word对应的最后一个节点 { while(nodes.size()!=0) { char c=*(--word); current=nodes.top()->son[c-base]; //取得当前处理的节点 if(current->num==1||del) //判断该节点是否只被word用,若不是,则不能删除 { if (del==1) del=0; delete current; nodes.top()->son[c-base]=NULL; //把上层的节点next中指向current节点的指针置为NULL nodes.pop(); } else //不能删,只把num相应减1 { current->num--; nodes.pop(); while(nodes.size()!=0) { char *c=--word; current=nodes.top()->son[*c-base]; current->num--; nodes.pop(); } break; } } return true; } else return false; } int main() { int i,n; scanf("%d",&n); Trie *root=NewTrie(); char a[40],b[40]; for (i=0;i