HDU
lajiyuan_
已经退役啦,会不定期更新cf博客 or 其他计算机知识相关的博客.
展开
-
【HDU 1686 Oulipo】KMP/HASH
HDU1686 题意就是求B串在A串中的出现次数(可重叠 依旧是利用next数组,当某次匹配完成之后,将ans++,然后把j跳转到next[j],原理类似上一题的不匹配的情况,省略不必要的查找。 HDU1686代码#include<stdio.h>#include<iostream>#include<string.h>using namesp...原创 2018-05-29 20:28:18 · 210 阅读 · 0 评论 -
【HDU 1069 Monkey and Banana】 排序+DP
HDU1069 题意就是一个小猴子有n种不同的长方体,每种有无数个,小猴子想把长方体垒到最高,要求上面的长方体的下表面严格小于下面的长方体的上表面, 根据题意我们知道一个长方体最多有六种可利用状态,我们按照长度为第一关键字,宽度为第二关键字排序,这样就保证了合法的拜访状态一定是按照这个顺序进行的,我们就可以n^2枚举转移了。 这一类DP有一个特点,先排序保证最优状态一定是按照这个顺序进...原创 2018-08-30 18:37:51 · 173 阅读 · 0 评论 -
【HDU 1074 Doing Homework】 状压DP
HDU1074 题意就是有n个科目要掌握,每种科目有一个开始时间和持续时间,求最少需要的时间 由于这个题n比较小,就是经典的状压DP,我们可以从小到大枚举所有状态,然后对每种状态保留能达到当前状态的最优解,再从小状态向大状态转移。由于这道题要输出保证字典序而且原题就是按照字典序给出的,所以我们可以倒着遍历,这样就保证了字典序。 HDU1074代码#include<stdio...原创 2018-08-30 18:39:05 · 190 阅读 · 0 评论 -
【HDU 1260】 捆绑DP
HDU1160 HDU1160经典的按照某个维度排序保证最优解一定是在这个顺序上的,然后再进行DP HDU1160代码 HDU1260 题意就是一个人单独买票有一个花费,和前一个人一起买票有另一种花费,求最少花费 经典的绑定DP,对于第i个人,可以选择和前一个人一起买,不和前一个人一起买 dp[i]=max(dp[i−1]+a[i],dp[i−2]+b[i])dp[i]=max(d...原创 2018-08-30 18:40:04 · 290 阅读 · 0 评论 -
【HDU 1078 FatMouse and Cheese】 DP+记忆化搜索
HDU1078 HDU1078 这个题我们可以看出每个点不管之前怎么走,之后能走的最大路径都是固定的,因为之前不管怎么走,只要走到了这个点,就说明没有走过比当前点权值大的点,所以我们可以记忆化搜索一下,就可以了。 HDU1078代码#include<stdio.h>#include<iostream>#include<algorithm>...原创 2018-08-30 18:42:41 · 129 阅读 · 0 评论 -
【HDU 2859 Phalanx】Hash+DP
HDU2859 HDU2859 求最大对称子矩阵,对称是延对角线对称,由于本题给出的对角线不方便操作,我们将所有字符串逆置一下,就变成了好操作的对角线,然后我们对每一行每一列进行hash,dp的时候只要从左上角dp值一直减小到0,判断是否有len满足向上和向左的hash值相等。 HDU2859代码#include<stdio.h>#include<iostream...原创 2018-08-30 18:43:42 · 225 阅读 · 0 评论 -
【HDU 5213 Lucky】 莫队算法
HDU5213 给你一个n个数的序列a,给你q个询问,每次询问给两个不相交的区间,求a[i]+a[j]=k的方案数 i属于第一个区间,j属于第二个区间。 对于这种两个区间内查询得问题,我们要看看能不能转化为一个区间之内的查询操作。 我们设f(l,r)f(l,r)f(l,r)为[l,r][l,r][l,r]区间内选i,j,a[i]+a[j]=ka[i]+a[j]=ka[i]+a[j]=k的方...原创 2018-08-29 21:23:01 · 214 阅读 · 0 评论 -
【HDU 4638 Group】 莫队算法
HDU4638 题意就是给你一个长度为n的序列,每次查询给一个区间,问区间可被分成多少个连续的段 例如 1,2,4,5被分为 [1,2],[4,5]两段。 我们可以考虑添加一个数对答案的影响,添加一个数的时候,如果他左右的数字都存在,显然段数-1 若左右存在某一个,段数不变 若左右均不存在,则段数+1 删除一个数的时候类似,自己推导一下就可以了。 代码#include&lt;st...原创 2018-08-29 21:27:06 · 201 阅读 · 0 评论 -
【HDU 4676 Sum Of Gcd】莫队算法
HDU4676 题意就是求某个区间内两两gcd之和。 关于一个区间内两两GCD之和,我们有一个推导: 对一个序列的某个区间L,R,每个数两两之间的GCD之和为Σd|nφ(d)×C2num(d)Σd|nφ(d)×Cnum(d)2\varSigma _{d|n}\varphi \left( d \right) \times C_{num\left( d \right)}^{2} d在这里指...原创 2018-08-29 21:27:51 · 369 阅读 · 0 评论 -
【HDU 4135 Co-prime】容斥定理+质因数分解
HDU4135 题意 求A-B之间与N互质的数的个数 做法 我们首先对N分解质因数,再对其所有因子进行容斥,最后能得到所有与N不互质的数的个数,最后用n减去这个个数,就是与n互质的数的个数。#include<stdio.h>#include<iostream>#include<algorithm>#include<vector>...原创 2018-09-11 13:40:57 · 208 阅读 · 0 评论 -
【HDU-2204- Eddy's爱好】 容斥原理
HDU-2204- Eddy’s爱好 题意就是给出一个数n,问1-n中有多少个数可以表示为m^k,m,k均为正整数且k>1 由于这里k是大于1的,所以我们想一下哪些k是可以被替代的,例如一个数如果可以被表示为m4m4m^4,那么他一定可以被表示为(m2)2(m2)2(m^2)^2,所以我们知道了只要枚举所有质数次幂的组合就可以了,同样当我们枚举2的整数次幂和3的整数次幂都会枚举到6,所...原创 2018-09-12 22:10:48 · 195 阅读 · 0 评论 -
【HDU-3208-Integer’s Power】容斥原理+DP
HDU-3208-Integer’s Power 题意就是定义power(x)power(x)power(x)为xxx能被表示为nknkn^k中最大的kkk,例如power(9)=2,power(32)=5,power(18)=1power(9)=2,power(32)=5,power(18)=1power(9)=2,power(32)=5,power(18)=1,给出l,rl,rl,r计算Σr...原创 2018-09-12 22:11:45 · 313 阅读 · 0 评论 -
【HDU-1796-How many integers can you find】 容斥原理
HDU-1796-How many integers can you find 题意就是给出一个整数n,一个具有m个元素的数组,求出1-n中有多少个数至少能整除m数组中的一个数 这道题就是经典的给出某个数组去组合的问题,只要对当前选中元素取lcm即可,但是要注意这题m数组会出现0,而且算术过程中ans,lcm可能会超过int,最好全程用long long 容斥原理第三题代码#inc...原创 2018-09-12 22:12:21 · 167 阅读 · 0 评论 -
【HDU-2841-Visible Trees】 容斥原理
HDU-2841-Visible Trees 这道题题意就是给出第一象限的n*m个点,求出站在原点可以看见多少个点 将题意稍微转化一下就变成了,求(a,b)(1<=a<=n,1<=b<=m,gcd(a,b)=1)(a,b)(1<=a<=n,1<=b<=m,gcd(a,b)=1)(a,b)(1...原创 2018-09-12 22:12:56 · 149 阅读 · 0 评论 -
【HDU-6183-Color it】 动态开点的线段树
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6183题意给你一个二维平面,最开始平面上没有任何点,有4种操作,给你一个二维平面,最开始平面上没有任何点,有4种操作,给你一个二维平面,最开始平面上没有任何点,有4种操作,第一种操作是 0 表示清除这个平面上所有的点第一种操作是 \ 0 \ 表示清除这个平面上所有的点第一种操...原创 2018-09-25 11:00:00 · 168 阅读 · 1 评论 -
【HDU 1024 Max Sum Plus Plus】 DP+滚动数组优化
HDU1024 最大M子段和 HDU1024 不太明白这个问题这么难竟然这么多的AC,这个题卡了很久最后去找了题解。 首先说一下题意,是给一个长度为n的序列,要求从序列出m个不相交的子段,使他们的和最大 n&lt;=1000000 我们首先想一下最暴力的DP方案 dp[i][j]表示选取第j个数字的情况下,将前j个数字分成i组的最大子段和 所以可能的情况有两种 ①(x1,y1),(...原创 2018-08-30 18:35:59 · 173 阅读 · 0 评论 -
【HDU 4821 String】 Hash+尺取
HDU4821 本题题意就是给你一个字符串,问你该字符串具有多少个子串满足 长度为m*l,而且可以拆成m个长度为l的不相同子串。 定长字符串问题,很明显是可以hash+尺取的,我们可以枚举l个子串的起点,之后算出当前m*l的字符串的情况,之后不断往后尺取就可以了 复杂度是o(l∗(len/l)∗log(m))o(l∗(len/l)∗log(m))o(l*(len/l)*log(m)) 因为...原创 2018-06-18 13:02:03 · 194 阅读 · 0 评论 -
【HDU 3065 病毒侵袭持续中】AC自动机
HDU3065 题意就是给你一些病毒网站关键字,统计每个关键字的出现次数,可重叠。 我们用病毒网站关键字搭建好AC自动机,用文本串在上面跑,由于每个Fail递归的过程是必包含当前后缀的(仔细思考),所以是不会出现重复统计的情况的,所以我们只需要在递归的时候对每个关键字计数,最后输出就可以了。 注意:多组输入,ASCII码可见字符有128种 HDU3065代码#include<...原创 2018-06-13 19:31:46 · 141 阅读 · 0 评论 -
【HDU 2087 剪花布条 】 KMP
HDU2087 题意就是求B串在A串中的出现次数(不可重叠) 做法和上题类似,只不过在每次完成匹配之后,要考虑不能重叠的问题,所以j不能跳转到next[j],而应该从0重新开始,因为A中已经匹配过的字符不能再利用,所以就变成了A剩下的子串中找B出现的次数,所以j应该从0重新开始匹配。 HDU2087代码#include<stdio.h>#include<iostr...原创 2018-05-29 20:29:17 · 141 阅读 · 0 评论 -
【HDU 3746 Cyclic Nacklace 】 KMP
HDU3746 本题题意为添加最少的字符使原字符串变成周期至少为2的循环字符串 用到模板里所说的,长度为len的字符串的最小循环节为len-next[len],求出最小循环节,算出最后应该补充多少就结束了。 求最小循环节的证明法请看此链接KMP求字符串最小循环节 HDU3746代码#include<stdio.h>#include<iostream>#inc...原创 2018-05-29 20:30:16 · 112 阅读 · 0 评论 -
【HDU 1358 Period 】 KMP
HDU1358 本题题意为求给定字符串中所有为循环串的前缀,并输出该前缀的最后一个字符下标和周期 用到模板中给定的方法,只要对每个字符串判定一下是否为循环串就可以了 HDU1358代码#include<stdio.h>#include<iostream>#include<string.h>using namespace std ;const...原创 2018-05-29 20:31:29 · 123 阅读 · 0 评论 -
【HDU 2594 Simpsons’ Hidden Talents 】 KMP
HDU2594 本题题意是求既是A串中的前缀又是B串中的后缀的最长长度。 如果我们将AB进行拼接,我们可以发现next[len1+len2]next[len1+len2]next[len1+len2]即为最长的即使前缀又是后缀的子串,但是这里有一个细节,就是如果这个长度大于min(len1,len2)min(len1,len2)min(len1,len2),代表这个是拼接之后产生的,是不可取的...原创 2018-05-29 20:36:11 · 125 阅读 · 0 评论 -
【HDU 3336 Count the string 】 KMP
HDU3336 本题题意为求字符串的每个前缀在整个字符串中的出现次数。 如果next[j]对答案有一个贡献,那么这个贡献在j中一定会再贡献一次,而且j为结尾的字符串对于总串产生的贡献只有长度为j的子串,(如果这个性质不懂,可以去看我的KMP总结专题性质二)于是我们可以得到转移方程ans[j]=ans[next[j]]+1ans[j]=ans[next[j]]+1ans[j]=ans[next[...原创 2018-05-29 20:38:22 · 172 阅读 · 0 评论 -
【HDU 4300 Clairewd’s message 】 KMP
HDU4300 本题题意比较难读懂,题意为给你一段密文的映射方式和一段密文+明文的字符串,密文是完整的,而明文不一定是完整的,让你添加最少的字符使他变为完整的密文+明文 如果读懂题意,可以考虑给定字符串中密文长度一定是&gt;=len/2&gt;=len/2>=len/2的,所以我们可以将后半段的字符均按照映射换为密文,然后找到最长的既在前缀中出现又在后缀中出现的子串,根据next数组的性质(...原创 2018-05-30 10:05:08 · 125 阅读 · 0 评论 -
【HDU 3374 String Problem 】 KMP&最小表示法
HDU3374 本题题意为求一个字符串旋转后的所有串中字典序最大和字典序最小分别出现的次数。 搜先我们要了解字符串的最小表示法o(n)o(n)o(n)的时间复杂度求出旋转后字典序最小的起始下标。 最小表示法戳这里字符串最小表示法 了解了最小表示法之后,我们考虑一下,会发现,只有字符串有循环节的时候才会出现旋转后有相同的串出现的情况,所以我们利用KMP判断是否字符串存在循环节(这里不懂的请看...原创 2018-05-30 10:04:42 · 138 阅读 · 0 评论 -
【HDU 2609 String Problem 】 最小表示法
HDU2609 本题为给你n个01串,可以对每个串旋转任意次,求最少出现多少个不同的字符串,我们可以知道,如果两个字符串是可以旋转之后相同的,那么他们的最小表示法一定是相同的,所以我们可以求出所有字符串的最小表示法,然后用一个set去重就好了。 HDU2609代码#include&lt;stdio.h&gt;#include&lt;iostream&gt;#include&lt;s...原创 2018-05-30 10:04:53 · 156 阅读 · 0 评论 -
【HDU 1251 统计难题】 字典树(Trie树) 模板题
HDU1251 题意就是统计出以某个字符串为前缀的单词数量,首先构建出trie树并记录每个节点的访问次数,然后在上面查询就好了,模板题。 HDU1251代码#include&lt;stdio.h&gt;#include&lt;iostream&gt;#include&lt;string.h&gt;using namespace std;const int maxn =2e6+5...原创 2018-06-12 23:35:35 · 254 阅读 · 0 评论 -
【HDU 2072 单词数】 字典树/SET
HDU2072 题意就是出现的不同单词个数 直接把字符全部插入Trie树中,然后统计所有具有flagg标记的节点个数就好了。 也可以边插入边统计,如果当前字符串结尾下标已经被标记,就不对答案做贡献,否则ans++. HDU 2072 代码#include<stdio.h>#include<iostream>#include<string.h>#...原创 2018-06-12 23:37:53 · 205 阅读 · 0 评论 -
【HDU 1247 Hat’s Words】字典树(Trie树)
HDU1247 本题题意是问你某个单词是否可以拆成单词表中的其他两个单词。 我们可以建两颗Trie树,然后分别正序倒序插入每个单词,对每个单词查询的时候,我们分别正序倒序查询,对出现过单词的前缀下表进行标记,对每个出现过单词的后缀进行标记,最后扫描标记数组,如果某个位置前缀后缀均被标记过,则表示可以拆成单词表中的两个其他单词。 HDU1247代码#include<stdio.h...原创 2018-06-12 23:55:23 · 191 阅读 · 0 评论 -
【HDU 1075 What Are You Talking About】 字典树(Trie树)
HDU1075 本题的题意是给你火星文与地球文的映射方式,然后给你一个火星文组成的文本,若某单词在映射文本中出现过,则输出映射之后的文本。否则输出原文本。 我们可以建立trie树,插入火星文本,将返回的下标pos与地球文相对应,在翻译文本的时候,从前往后截取每一段单词,在trie树上查找该单词是否出过,要注意必须是单词,而不能是某单词的前缀。若找到则返回下标,然后输出该下标对应的地球文,否则返...原创 2018-06-13 00:02:49 · 211 阅读 · 0 评论 -
【HDU 2222 Keywords Search】 AC自动机(模板题)
HDU2222 题意就是统计一个文本串中出现过多少个给定的字符串,每个给定的字符串只统计一次。 这就是AC自动机的裸题,我们直到AC自动机的精髓在于状态转移,我们可以从k状态转移到k+1的状态,所以我们只需要把文本串放到AC自动机上面沿着Trie树跑,然后用Fail来递归寻找出现过的前缀,统计贡献就好了,注意统计贡献的时候要将贡献清空,否则一个字符串将统计多次 HDU2222代码#i...原创 2018-06-13 19:29:01 · 200 阅读 · 0 评论 -
【HDU 2896 病毒侵袭】 AC自动机
HDU2896 题意就是给你一些病毒网站的关键字,再给你一些网站链接,问每个网站出现过哪些病毒网站关键字 我们只需要用病毒网站关键字构建出AC自动机,之后对每个网站开一个set存储与见过的病毒网站关键字下标就可以了,注意本题字符为ASCII码可见字符,所以tree[][]数组第二维要开到128 HDU2896代码#include<stdio.h>#include<...原创 2018-06-13 19:30:21 · 130 阅读 · 0 评论 -
【HDU-6191-Query on A Tree】 可持久化01字典树
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6191题意给你一颗带权树,每次查询以u为根的子树上与x异或的最大值给你一颗带权树,每次查询以u为根的子树上与x异或的最大值给你一颗带权树,每次查询以u为根的子树上与x异或的最大值做法由于出现子树,我们就可以处理出dfs序由于出现子树,我们就可以处理出dfs序由于出现子树,我们就可以处理出dfs序...原创 2018-09-25 11:01:43 · 405 阅读 · 0 评论