Trie
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
第 k 大区间
题目链接:第 k 大区间因为k很大,显然可以想到二分。利用前缀异或和变成两个点的异或。然后就是枚举每一个后缀,求异或大于某个数的个数。直接Trie上查询即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10;int n,k,a[N],ch[N*32]原创 2020-11-26 01:43:32 · 409 阅读 · 0 评论 -
前缀单词
题目链接:前缀单词按照Trie建树,我们可以发现儿子和祖先关系是不能同时选取的。然后树形dp即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=60,M=N*N;int n,ch[M][26],ed[M],idx,dp[M]; char str[N];vec原创 2020-10-04 12:36:38 · 238 阅读 · 1 评论 -
「EZEC-4」可乐
题目链接:「EZEC-4」可乐可能的合法解最多为值域的2倍。然后枚举每个值,在Trie上面查询满足的合法解即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+10;int n,K,ch[N*21][2],sz[N*21],cnt,res;inli原创 2020-09-07 13:37:11 · 228 阅读 · 0 评论 -
Codeforces - Matching Names
题目链接:Codeforces - Matching Names因为是前缀信息,所以我们可以发现,每次选LCP最长的匹配一定是最优的。于是Trie上面贪心即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int n,t[N*8][26],i原创 2020-08-24 14:46:41 · 218 阅读 · 0 评论 -
HDU - 6096
题目链接:HDU - 6096前后缀分开的,很麻烦,所以想办法拼凑在一起。对每个字符串例如1234 ,我们构造成 1 4 2 3 3 2 4 1然后对查询的串一样构造即可,当某个不存在时,用特殊符号代替。然后防止前后串重叠,所以我们按照长度排序。离线做。如果强制在线的话,就只能换成可持久化Trie了AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define i原创 2020-08-02 17:34:38 · 191 阅读 · 0 评论 -
Nikitosh and xor
题目链接:Nikitosh and xor显然区间异或,我们可以通过前缀异或和变为两点异或最大值。我们从前往后扫,可以维护每次加入一个点的,对于当前点能到的最大值。所以我们可以维护一个前缀最大值,然后再维护一个后缀最大值。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const原创 2020-05-12 10:26:09 · 250 阅读 · 0 评论 -
HDU - 4757 Tree
题目链接:HDU - 4757 Tree显然,如果是区间之间可持久Trie即可。现在是树上路径,我们先树上前缀和,查询的时候树上差分即可。然后就是可持久化Trie的基本操作了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int n,m,a原创 2020-05-11 19:47:42 · 176 阅读 · 0 评论 -
First! G
题目链接:First! G考虑某个单词是否合法,我们从前往后扫。对于在Trie上面,当前这个字母一定是最小的,所以我们可以利用这个关系判是否存在环。还有,如果这个单词存在某个前缀也是不合法的。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=3e5+10;i原创 2020-05-11 17:35:23 · 134 阅读 · 0 评论 -
Remember the Word
题目链接:Remember the Word这种计数问题,显然可以dp。考虑状态:dp[i]为以i开始的后缀的方案数。考虑转移:因为单词长度不大于100,我们可以直接暴力向后看当前单词是否存在,所以可以用Trie或者字符串哈希完成。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;con原创 2020-05-11 16:57:36 · 300 阅读 · 0 评论 -
Codeforces - Choosing The Commander
题目链接:Choosing The Commander维护一个带删除的Trie,然后每次在Trie中找即可。分别讨论一下。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;c...原创 2020-03-30 14:24:25 · 307 阅读 · 5 评论 -
HDU - 6625
题目链接:HDU - 6625最小字典序,显然可以贪心。先选一个最小的数字,然后再选。。。所以维护两颗字典树,然后尽量走相同的位置即可。因为Test比较多,所以我们不能memset清空,我们像线段树的lazy一样,先清空头部,每次开点的时候,再清空儿子即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#includ...原创 2020-02-24 17:45:20 · 267 阅读 · 0 评论 -
Codeforces - Vitya and Strange Lesson
题目链接:Codeforces - Vitya and Strange Lesson逆向思维。显然不可能每次改变数列,我们通过异或的性质,改变一个数字,然后用这个数字查询的时候异或数列即可。怎么找最小呢?我们把未出现的数字放到Tire当中,而不是放出现过的。那么找异或min即为答案。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-lo...原创 2020-02-14 19:03:56 · 169 阅读 · 1 评论 -
Codeforces - Vasiliy's Multiset
题目链接:Codeforces - Vasiliy’s Multiset维护一个带删除字典树即可。AC代码;#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=2e...原创 2020-02-03 20:26:27 · 123 阅读 · 0 评论 -
Codeforces - Beautiful Subarrays
题目链接:Codeforces - Beautiful Subarrays先用前缀和转换为:找两个数字 x ,y ,x^y>=k 的个数。那么我们可以用Trie去找。从前往后插入前缀和。如果当前插入值为x,那么我们从高位到低位看。如果k这一位为0,那么我们只要这一位可以为1就能贡献答案,然后从这一位为0的继续找。如果k这一位为1,那么我们只能从这一位为1的继续找。AC代码:...原创 2020-02-03 13:05:16 · 242 阅读 · 0 评论 -
BZOJ - 3251 最大异或和
Description给定一个非负整数序列{a},初始长度为N。有M个操作,有以下两种操作类型:1、Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。2、Qlrx:询问操作,你需要找到一个位置p,满足l<=p<=r,使得:a[p] xor a[p+1] xor … xor a[N] xor x 最大,输出最大是多少。Input第一行包含两个整数 N ,M,含...原创 2020-01-13 19:03:38 · 256 阅读 · 1 评论 -
[十二省联考2019]异或粽子
题目描述小粽是一个喜欢吃粽子的好孩子。今天她在家里自己做起了粽子。小粽面前有 nn 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 11 到 nn。第 ii 种馅儿具有一个非负整数的属性值 ai 。每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子。小粽准备用这些馅儿来做出 k 个粽子。小粽的做法是:选两个整数数 l, r,满足 1 \leqslant l \l...原创 2020-01-13 18:15:39 · 286 阅读 · 0 评论 -
筱玛的迷阵探险
题目链接:筱玛的迷阵探险数据量比较小,于是可以想到爆搜,但是复杂度为 2^40,必然不行,于是对于二进制求max,我们可以想到用Trie去维护。怎么做呢?我们双向dfs,对每一个走到 n/2 步数的节点分别开一个Trie,然后下一次从终点走到这个节点时,然后从这个节点当中的Trie里面去找max。总复杂度为: 2^20 * 30 完全ok。AC代码:#include<bits/s...原创 2019-12-23 17:09:21 · 85 阅读 · 0 评论