这题还是一样的题型,插入和查询,这次查询 find 函数中要注意的就是如果遍历到一个结点之后对应的 next 指针为空,就返回 0。
用 cnt 记录前缀出现次数,这时候就不用 danger 标记了。
我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <algorithm> #include <bitset> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <numeric> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector>
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; }
|