摘要:
题目问区间有多少个数字的二进制0的个数大于等于1的个数。 用数学方法求出0到n区间的合法个数,然后用类似数位DP的统计思想。 我大概是这么求的,确定前缀的0和1,然后后面就是若干个0和若干个1的不重复全排列数。。 写得挺痛苦的。。另外A[i][j]表示i个0和j个1的不重复全排列数,即A[i][j] 阅读全文
摘要:
题目问长度m不包含一些不文明单词的字符串有多少个。 依然是水水的AC自动机+DP。。做完后发现居然和POJ2778是一道题,回过头来看都水水的。。。 dp[i][j]表示长度i(在自动机转移i步)且后缀状态为自动机第j个结点的合法字符串数 dp[0][0]=1 转移转移。。。 注意要用高精度,因为答 阅读全文
摘要:
题目是给一个DNA重新排列使其包含最多的数论基因。 考虑到内存大概就只能这么表示状态: dp[i][A][C][G][T],表示包含各碱基个数为ACGT且当前后缀状态为自动机第i的结点的字符串最多的数论基因数 其中ACGT可以hash成一个整数(a*C*G*T+c*G*T+g*T+T),这样用二维数 阅读全文
摘要:
题目是给几个带有价值的单词。而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题。。不一样的是这题要输出具体方案,加个字符数组记录每个状态最优情况的字符串即可。 另外题目字典序是先考虑长度再考虑每一位单词;特别要注意, 阅读全文
摘要:
题目大概是给几个DNA片段以及它们各自的权值,如果一个DNA包含某个片段那么它的价值就加上这个片段的权值,同时包含多个相同DNA片段也只加一次,问长度l的DNA可能的最大价值。 与HDU2825大同小异。 dp[i][j][S]表示长度i(自动机转移i步)、后缀状态为自动机第j个结点、包含的DNA片 阅读全文
摘要:
题目给一棵有边权的树,问树上任意两点路径上的边异或值最多是多少。 记录每个点u到根路径的异或值xor[u],那么任意两点u、v路径的异或值就是xor[u]^xor[v]。 于是这个问题就变成了从n个数中任取两个数异或,求最大异或值,这是个经典的问题,用字典树解决。 方法就是所有数的二进制形式构建成一 阅读全文
摘要:
题目问长度n至少包含k个咒语的字符串有多少个。也是比较入门的题。。 dp[i][j][S]表示长度i(在自动机上转移k步)且后缀状态为自动机上第j个结点且当前包含咒语集合为S的方案数 dp[0][0][0]=1 还是用我为人人转移,AC自动机上的结点要多一个域表示这个结点所代表咒语前缀包含的咒语集合 阅读全文
摘要:
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段。 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来。 dp[i][j]表示原DNA前i位(在AC自动机上转移i步)且后缀状态为AC自动机结点j的最少需要修改的基因数 转移我为人人型,从dp[i][j]向ATCG四个 阅读全文
摘要:
与POJ2778一样。这题是求长度不超过n且包含至少一个词根的单词总数。 长度不超过n的单词总数记为Sn,长度不超过n不包含词根的单词总数记为Tn。 答案就是,Sn-Tn。 Sn=26+262+263+...+26n Tn=A+A2+A3+...+An (A为AC自动机构造出来的矩阵) 可以构造矩阵 阅读全文
摘要:
题目给m个病毒串,问不包含病毒串的长度n的DNA片段有几个。 感觉这题好神,看了好久的题解。 所有病毒串构造一个AC自动机,这个AC自动机可以看作一张有向图,图上的每个顶点就是Trie树上的结点,每个结点都可以看作是某个病毒串的前缀,Trie树的根则是空字符串。 而从根出发,在AC自动机上跑,经过k 阅读全文
摘要:
题目大概是依次有n场派对,每场派对都有需要穿某套衣服去参加,可以同时穿多套衣服,就是一套套着一套,如果脱了的话就不能再穿上那套了,问最少需要几套衣服去参加完所有派对。 区间DP: dp[i][j]第i场到第j场派对需要最少的衣服 dp[i][i]=1 dp[i][j]=min(dp[i][j-1]+ 阅读全文
摘要:
AC自动机是一种多模式匹配的算法。大概过程如下: 而这题大概就是给几个模式串,一个主串,问有几个模式串被主串匹配。 AC自动机的模板题。有个可以优化的地方就是某个模式串被匹配了,下一次经过这儿就可以跳过了temp指针的过程了。 代码参考自kuangbin巨的博客,太简洁了(300+ms): 阅读全文
摘要:
题目给定一个字符串集合有几种方式拼成一个字符串。 dp[i]表示stri...strlen-1的方案数 dp[len]=1 dp[i]=∑dp[j](stri...strj-1∈SET) 用集合的字符串构造一棵Trie树,然后就可以在线性时间判断哪几个前缀字符串在集合里。 1 #include<cs 阅读全文
摘要:
我的做法是先建字典树,统计每个结点出现次数和相同字符串个数,每个结点对答案的贡献就是2*C(次数,2),然后再分别讨论相同字符串和不同字符串对答案的贡献。 另外这题主要就是Trie树的孩子兄弟表示法: 因为数据范围,4000个字符串每个字符串长度1000且字符的范围有62个,用孩子链表表示法最坏,4 阅读全文
摘要:
题目大概是,二进制数可以看作是由几段连续的0和连续的1组成,问:n位没有前导0的 且 共用k段连续0/1组成的 且 连续0/1个数不超过m的二进制数有多少个。 用dp[n][k][m]表示问题 dp[i][1][j]=1 (i<=j) 通过枚举第一段连续数字的个数first,使dp[n][k][m] 阅读全文