这题还是一样的题型,插入和查询,这次查询find函数中要注意的就是如果遍历到一个结点之后对应的next指针为空,就返回0。 用cnt记录前缀出现次数,这时候就不用danger标记了。 我的代码: #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <algorithm> #include <stack> #include <bitset> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdlib> #include <cstdio> #include <cstring> #include <cctype> #include <string> #include <ctime> #include <cmath> using namespace std; const int MAX=1000000; struct Node{ int cnt; Node* ne[26]; }node[MAX],*root; int K; Node* New(){ Node* ret=&node[K++]; ret->cnt=0; for(int i=0;i<26;i++){ ret->ne[i]=NULL; } return ret; } void init(){ K=0; root=New(); } void insert(char* s){ char* p=s; Node* ptr=root; int id; while(*p){ id=*(p++)-'a'; ptr->cnt++; if(ptr->ne[id]==NULL){ ptr->ne[id]=New(); } ptr=ptr->ne[id]; } ptr->cnt++; } int find(char* s){ char* p=s; Node* ptr=root; int id; while(*p){ id=*(p++)-'a'; if(ptr->ne[id]==NULL){ return 0; } ptr=ptr->ne[id]; } return ptr->cnt; } int main(){ char s[120]; init(); while(gets(s),*s){ insert(s); } while(gets(s)){ printf("%d/n",find(s)); } return 0; }