字典树题目集
Posted mrzdtz220
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典树题目集相关的知识,希望对你有一定的参考价值。
字典树都是跟的这个博客学的→:https://blog.csdn.net/qq_38891827/article/details/80532462
这些题目也都是他里面的题目,就是把题目按难度排了个序 + 自己整理了下思路(代码也差不多
主要是为了记录一下 忘了的话以后可以翻翻看hhh
模板
const int maxn = 1e5 + 10; int Next[maxn][26]; bool flag[maxn]; int tol; void Insert(char *s) { int len = strlen(s); int root = 0; for (int i = 0; i < len; i++) { int id = s[i] - ‘a‘; if (!Next[root][id]) tree[root][id] = ++tot; root = Next[root][id]; } flag[root] = true; } bool Find(char *s) { int len = strlen(s); int root = 0; for (int i = 0; i < len; i++) { int id = s[i] - ‘a‘; if (!Next[root][id]) return false; root = Next[root][id]; } return true; }
maxn这个要开多大得看具体题目 有的题目非2e6不可 有的1e5都会爆 所以很绝望...
第一道题:单词数HDU - 2072
模板题咯 边插入边统计答案即可
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; int Next[maxn][26], cntword[maxn], tol, ans; void Insert(string s) { int len = s.size(); int root = 0; for (int i = 0; i < len; i++) { int id = s[i] - ‘a‘; if (!Next[root][id]) Next[root][id] = ++tol; root = Next[root][id]; } if (!cntword[root]) ans++; cntword[root] = 1; } string s; int main() { while (getline(cin, s)) { ans = 0; memset(Next, 0, sizeof(Next)); memset(cntword, 0, sizeof(cntword)); tol = 0; if (s[0] == ‘#‘) return 0; stringstream ss(s); string s2; while (ss >> s2) { Insert(s2); } cout << ans << ‘ ‘; } return 0; }
第二道题:统计难题HDU-1251
这道题就把flag变一下 表示成每一个单词里面每个字母出现的次数
对每一个字符串进行Find操作 如果到哪个位置没字母了 答案就是0 因为根据题意 后面给的字符串得作为前面插入的字符串的前缀
所以这个Find操作必须搜到这个字符串的结尾 所以中途无法继续下去就直接返回0
找到最后返回flag[root]就行了(代码中用的是cntword
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6 + 10; int Next[maxn][26]; int cntword[maxn]; int tol; void Insert(char *s) { int len = strlen(s); int root = 0; for (int i = 0; i < len; i++) { int id = s[i] - ‘a‘; if (!Next[root][id]) Next[root][id] = ++tol; root = Next[root][id]; cntword[root]++; } } int query(char *s) { int root = 0; int len = strlen(s); for (int i = 0; i < len; i++) { int id = s[i] - ‘a‘; if (!Next[root][id]) return 0; root = Next[root][id]; } return cntword[root]; } char s[maxn]; int main() { while (gets(s)) { if (s[0] == ‘