随笔分类 -  { 字符串 { Trie树 } }

摘要:题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串。 UVa1401,一个道理。。dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移。 阅读全文
posted @ 2016-07-17 09:24 WABoss 阅读(355) 评论(0) 推荐(0)
摘要:题目大概说给一个加密的字符串,加密规则是把原文转化成小写字母,然后各个单词反转,最后去掉空格。现在给几个已知的单词,还原加密的字符串。 和UVa1401一个道理。。 用dp[i]表示加密字符前i个字符都被解密时,最后所用单词编号,为0表示不能被解密 然后转移一个样,从i出发往前在Trie树上跑,看看 阅读全文
posted @ 2016-07-15 16:38 WABoss 阅读(304) 评论(0) 推荐(0)
摘要:题目给一棵有边权的树,问树上任意两点路径上的边异或值最多是多少。 记录每个点u到根路径的异或值xor[u],那么任意两点u、v路径的异或值就是xor[u]^xor[v]。 于是这个问题就变成了从n个数中任取两个数异或,求最大异或值,这是个经典的问题,用字典树解决。 方法就是所有数的二进制形式构建成一 阅读全文
posted @ 2016-01-30 16:38 WABoss 阅读(212) 评论(0) 推荐(0)
摘要:题目给定一个字符串集合有几种方式拼成一个字符串。 dp[i]表示stri...strlen-1的方案数 dp[len]=1 dp[i]=∑dp[j](stri...strj-1∈SET) 用集合的字符串构造一棵Trie树,然后就可以在线性时间判断哪几个前缀字符串在集合里。 1 #include<cs 阅读全文
posted @ 2016-01-27 15:45 WABoss 阅读(509) 评论(0) 推荐(0)
摘要:我的做法是先建字典树,统计每个结点出现次数和相同字符串个数,每个结点对答案的贡献就是2*C(次数,2),然后再分别讨论相同字符串和不同字符串对答案的贡献。 另外这题主要就是Trie树的孩子兄弟表示法: 因为数据范围,4000个字符串每个字符串长度1000且字符的范围有62个,用孩子链表表示法最坏,4 阅读全文
posted @ 2016-01-27 12:23 WABoss 阅读(440) 评论(0) 推荐(0)
摘要:常规做法是枚举每个字符串每个位置,时间复杂度O(n*len*len),(建字典树O(n*len))。 然而我看这题第一眼想的是时间复杂度O(n*len)的算法。。就是建正反两棵字典树,每个字符串跑分别跑正反一遍字典树,再看看正反跑的结果能不能拼成原串。 然而常数太大了点,并没什么卵用。。 1 #in 阅读全文
posted @ 2016-01-26 20:40 WABoss 阅读(208) 评论(0) 推荐(0)