传送门:HDU 1251
关于Trie树
题解
- 基本Trie树构造和查询, 空间换时间
- 注意这题读字符串只能用gets();或者gets_s();
收获
Trie入门
this指针
终于把实验室搬家了, 新的机子挺好用
AC code:
/*
adrui's submission
Language : C++
Result : Accepted
Love : yy
Favorite : Dragon Balls
Standing in the Hall of Fame
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
#include<bitset>
#include<map>
using namespace std;
#define M(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define ls rt << 1, l, mid
#define rs rt << 1|1, mid + 1, r
#define lowbit(x) (x & (-x))
#define LL long long
#define REP(n) for(int i = 0; i < n; i++)
#define debug 0
const LL mod(1e9 + 7);
int idx(char p) {
return p - 'a';
}
struct TrieTree {
bool exist;
int cnt;
TrieTree *next[26];
TrieTree() { //构造
M(next, 0);
cnt = 0;
exist = false;
}
void insert_node(char *s) { //插入
TrieTree *root = this;
char *p = s;
while (*p) {
int tmp = idx(*p);
if (root->next[tmp] == NULL) {
root->next[tmp] = new TrieTree();
}
root = root->next[tmp];
root->cnt += 1;
++p;
}
root->exist = true;
}
int query(char *s) { //查询
TrieTree *root = this;
char *p = s;
while (*p) {
int tmp = idx(*p);
if (root->next[tmp] == NULL) {
return 0;
}
root = root->next[tmp];
++p;
}
return root->cnt;
}
};
int main() {
#if debug
freopen("in.txt", "r", stdin);
#endif //debug
cin.tie(0);
cin.sync_with_stdio(false);
char s[15];
TrieTree *root = new TrieTree();
int flag = 0;
while (gets_s(s)) {
//cout << s << endl;
if (strcmp(s, "") == 0) {
flag = 1;
continue;
}
if (!flag) root->insert_node(s);
else cout << root->query(s) << endl;
}
return 0;
}