随笔分类 - 字符串 - Trie
摘要:题目大意:给定 N 个字符串组成的字典,有 M 个询问,每次给定一个字符串,求字典中有多少个单词为给定字符串的前缀或前缀是给定的字符串。 题解:在 trie 上维护一个 tag 表示有多少字符串以当前字符串为前缀,ed 表示从该节点到根节点之间为一个字符串。 对于给定的字符串,在 trie 中顺序查
阅读全文
摘要:题目大意:给定一个长度为 N 的字符串和一个字典,字典中所有的字符串的长度均不超过 10,求给定的字符串从前往后最多有多少位可以与字典匹配。 题解:设 $dp[i]$ 表示串的前 i 位是否能够与字典匹配,若 $dp[i]=1$,则对 s[i+1,~] 部分与字典进行匹配,即:对可以匹配的最大长度进
阅读全文
摘要:题目大意:给定一个长度为 N 的序列,支持两个操作:在序列末尾添加一个新的数字,查询序列区间 $[l,r]$ 内使得 $a_p\oplus a_{q+1}\oplus ... a_N\oplus x$ 值最大。 题解:由于是查询区间的最大异或值,可知应该使用可持久化数据结构,再由于是最大异或和,可知
阅读全文
摘要:题目大意:给定一个字符串和一个字符串集合,问从集合中选出若干个串组成给定母串的不同方案数。 题解:有些类似于背包问题。状态很好表示,为:$dp[i]$ 表示母串前 i 个字符的不同方案数,因此,有状态转移方程为:$$dp[i]=\sum dp[j],s[j+1...i]=s_0,s_0\in set
阅读全文
摘要:题目大意:需要维护一种数据结构,支持以下三种操作:插入一个数,删除一个数,查询该数据结构中的数异或给定数的最大值。 题解:如果没有删除操作就是一个标准的 Trie 上贪心求最大异或和问题。现在需要支持删除操作,因此,在树上每个节点维护一个额外的标记,表示 有多少个数的某一位经过当前节点 。插入操作依
阅读全文
摘要:题目大意:需要维护一个支持以下操作的数据结构:(1)支持插入一个字符串(2)支持删除所有前缀等于给定字符串的单词(3)查询该数据结构中是否存在一个以给定字符串为前缀的字符串 题解:由题目可知,需要维护数据结构就是一棵字典树。其中,支持插入和查找操作是字典树中的基本操作,即:在 Trie 的每个顶点处
阅读全文
摘要:题目大意:给定 N 个数,求这 N 个数中任选两个数进行异或运算,求最大的异或和是多少。 一个 int 类型的整数,可以看作一个长度为32位的字符串,异或运算不像加法,最大值不一定是由两个较大值得到。 在这里,可以采取一种树上贪心操作,即:将每个整数按照位的顺序从高位插入一棵 trie 树,并且在每
阅读全文
摘要:代码如下 cpp int trie[maxn][26],tot=1,ed[maxn]; void insert(char s){ int len=strlen(s+1),now=1; for(int i=1;i
阅读全文

浙公网安备 33010602011771号