HDU OJ
文章平均质量分 91
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
BestCoder Round #75 King's Cake 模拟&&优化 || gcd
It is the king's birthday before the military parade . The ministers prepared a rectangle cake of size n \times m(1\le n, m \le 10000)n×m(1≤n,m≤10000) . The king plans to cut the cake himself. But he has a strange habit of cutting cakes. Each time, he will原创 2016-03-12 22:50:01 · 1234 阅读 · 0 评论 -
HDU 5904 LCIS __ dp、LCIS
dp、LCIS、 最长公共上升子序列且每次递增 1 状态定义:dpa[i] 表示以ai结尾的每次递增 1 的 LIS 的最大长度, dpb[j] 表示以bi结尾的的每次递增 1 的 LIS 的最大长度, 边界:当 i == 1时, dpa[i] = 1, dpb[i] = 1; 状态转移方程: dpa[i] = dpa[Inda[a[i] - 1]] + 1; dpa[i] = max(dpa[i], dpa[Inda[原创 2016-09-27 23:49:35 · 632 阅读 · 0 评论 -
HDU - 2825 Wireless Password AC自动机+状压dp
题意:给出一个字符串集合,集合里包含m(m <= 10)个长度不大于10的字符串,要求构造长度为n(1<=n<=25)的字符串且子串中至少出现k个集合里的字符串,求方案数 MOD 20090717。 AC自动机+状压dp AC自动机上统计类的dp问题,dpijs表示在处理主串第i个字符遍历到了AC自动机上的j号节点s且当前构造成的字符串中包含的集合信息s时的方案数。 这里的s是一个长度为10的二进制数(表现形式为32位的带符号),第i位为1则表示构造出的字符串中包含了给定集合中的第i个字符串。 若dpijs原创 2017-05-18 21:35:02 · 1174 阅读 · 0 评论 -
HDU - 4417 Super Mario 主席树+二分
题意:给出一个长度为n(1<=n<=1e5)的数组,m(1<=m<=1e5)次询问,每次询问在区间[L,R]中小于等于X的数的个数。 主席树+二分 朴素的主席树是查询区间第k大(从小到大第k大),所以只需要在每次询问的时候二分的找出在此区间里比X大的最小的数的大小,比如这个值为y(初始化为-1),则答案为y-1,即把这个比X大的数去掉(因为X可能不止一个,所以要这样处理),此外如果y未被刷新则说明X是这个区间最大的数了 此时y = R-L+1。 所以时间复杂度原创 2017-07-31 16:05:55 · 869 阅读 · 0 评论 -
HDU 6138 Fleet of the Eternal Throne 后缀数组+字典树
题意:给出n(n<=1e5)个字符串,且字符串的字符总和<=1e5,给出m个询问,每次给定x,y,找出对于给定str[x]和str[y] 的公共子串且满足这个串是所有串中的某个串的前缀,要求所得的公共串的长度尽可能大。 后缀数组+字典树 首先用给出的n个字符串建立字典树, 然后对于每次的询问,把str[x]和str[y]用‘#’连起来然后跑出后缀数组, 对于所有的ind[i](其中sa[ind[i]] <= len, ind[i]为其在sa数组中的下标),然后对于 ind[i] - ind[i-1] > 1原创 2017-08-19 20:52:50 · 774 阅读 · 0 评论 -
HDU 6208 The Dominator of Strings 后缀自动机
题意:每组数据给出n个字符串,每组总共最多1e5个字符,然后要求判断,其中是否存在一个字符串,而其它字符串是这个字符串的子串。总共有30MB的输入。 贪心+后缀自动机 如果用AC自动机来做很可能会TLE,但后缀自动机在这里相对不容易被卡掉,首先我们多出了一个贪心优化,那就是那个可能存在的母串必定是长度最长的字符串,如果长度最长的字符串不止一个,则它们必定是完全相同的,所以后缀自动机只会用最长的那个字符串来建立自动机,而如果是AC自动机则必须使用全部的字符串来建立自动机,加上乘个memset[26]很容易被卡原创 2017-09-18 12:31:40 · 1271 阅读 · 0 评论 -
HDU 6194 string string string 后缀数组+lcp、Two Pointers
题意: 给出一个字符串,询问恰好出现k次的子串的种数。 后缀数组+ST表 对于给定字符串,跑出sa[]和height数组,然后预处理出ST表。 然后类似于Two Pointers的做法,维护一个长度为k-1的height数组的区间,一次从k到length(s)推一遍。 ans += st.query_min(i - k + 2, i) - max(st.query_min(i - k + 2, i+1), st.query_min(i - k + 2 - 1, i)); 这里维护的是k个后缀的最大公共前缀原创 2017-09-12 16:43:31 · 1020 阅读 · 0 评论 -
POJ - 3321 Apple Tree dfs序+线段树 简单题
题意:初始时树上每个节点都有1个苹果,然后对一个节点操作,如果有苹果,就拿走,没苹果,就放上,然后询问以x为根的子树上有多少个苹果。 dfs序简单题 POJ这题好像没有开O2,vector<int> sons[MAXN];一直TLE,换了邻接表就过了。 时间复杂度 O(n) 空间复杂度 O(4*n)原创 2017-10-11 22:51:56 · 680 阅读 · 0 评论 -
HDU - 3887 Counting Offspring dfs序+线段树
题意:问对于每个节点,它的子树上标号比它小的点有多少个。 dfs序+线段树 关于dfs序: dfs序是处理树上问题很重要的一个工具,主要能够解决对于一个点,它的子树上的一些信息的维护,即用来处理子树的问题。 dfs序一般开的空间是n,因为只在入的地方时间戳++,出来的地方时间戳没有额外的++,线段树的每个节点应当是时间戳。 这里,因为点在它的子树上,所以在线段树中,故在它的两个时间戳的区间内([p1[i],p2[i]),所以我们只需要从小到大考虑,它的区间里有多少个点已经放入,然后再把它放入即可。 时间复原创 2017-10-11 19:14:37 · 682 阅读 · 0 评论 -
HDU - 6191 Query on A Tree 可持久化字典树+dfs序
题意:给出一颗树,每个节点有一个权值,q个询问,询问以点u为根的子树中的节点权值异或x所得的值的最大值。 可持久化字典树+dfs序 对子树进行询问很容易想到dfs序,然后变成了线性的询问区间[l,r]内异或x所得的最大值,这个是可以用可持久化字典树来做,类似于主席树,每颗字典树维护的是区间[1,i]的信息,询问的时候,如果sum[r]-sum[l-1]大于0则说明在这个区间内这个值是存在的,然后按照通常的0-1树的做法,每次尽可能访问x&(1<<i)的异或值即可是答案尽可能大。 空间复杂度 O(nlogn)原创 2017-10-26 12:43:07 · 1006 阅读 · 0 评论 -
HDU - 5769 Substring 后缀自动机+二分、新增distinct子串的个数和位置
题意:每次给出一个字母ch和一个字符串s,求s中有多少个不同的子串含有字母ch。 后缀自动机+二分、新增distinct子串的个数和位置 首先这里要用到后缀自动机的一个性质, 添加第i个字符时,自动机里新增了diff = val[np] - val[pre[np]] 个与原先不同的子串,它们分别是 s[0......i],s[1......i],……,s[diff-1......i], 这里可以证明,当k < j < i 时,如果 s[j......i]是新增的不同子串,则s[k......i]包括了s[j原创 2017-03-12 22:48:34 · 701 阅读 · 0 评论 -
HDU - 3487 Play with Chain __ Splay
题意:对1~n这n个数,进行m次操作,分别可以进行区间移动和区间反转,求最终的序列。 Splay Splay的基础题,按照要求进行区间移动和区间反转即可。 复杂度 O(m*logn)原创 2017-03-17 23:24:03 · 657 阅读 · 0 评论 -
HDU - 4622 Reincarnation 后缀自动机
题意:给出一个长度<=2000的字符串,然后给出q<=10000个询问,为s[l,r]内有多少个不同的子串。 后缀自动机 首先n <= 2000,故可以用O(n^2)的算法,故对于每个 i ~ n-1建立n个后缀自动机,每次添加一个字符就多出val[np] - val[pre[np]]个不同的子串, valx]表示x节点存储的字符串个数即能表示的最长子串。 故用sum[maxn][maxn] n个前缀和来存储区间内不同子串的个数。 复杂度 O(n^2)原创 2017-03-05 19:04:21 · 1077 阅读 · 0 评论 -
BestCoder Round #75 King's Order dp:数位dp
After the king's speech , everyone is encouraged. But the war is not over. The king needs to give orders from time to time. But sometimes he can not speak things well. So in his order there are some ones like this: "Let the group-p-p three come to me". As原创 2016-03-13 14:24:22 · 1338 阅读 · 0 评论 -
HDU 2680 Choose the best route 最短路、Dijkstra、多源化单源最短路
最短路 有多个起点, 设为 g[0][i] = 0, 这样Dijkstra的 dist[i] 表示的是0 到 i的最短路径, 并且这样一设置 0 - 那些起点的路径长度就是0了,所以就当作起点是0, 化为了单源最短路 所以跑一遍Dijkstra就好了原创 2016-07-26 01:20:47 · 1146 阅读 · 0 评论 -
HDU 5308 I Wanna Become A 24-Point Master 循环(散乱的前缀+循环体)
计算的时候是乘进去的, 不然有精度损失 n == 1,显然不能得到24; n == 2,显然不能得到24; n == 3,一共有16种运算方法, 都无法得到24; n == 4,4*4+4+4=24; n == 5,5*(5-5/5/5)=24; n == 6,6+6+6+6+6-6=24; n == 7,(7*7-7/7)/(7+7)*7=24; n == 8,8+8+8+(8-8)*8*8*8=24; n == 9,9+9+9-9/9-9/9-9/9=24; n == 10,10+10+10/10+10原创 2016-07-27 00:46:07 · 1201 阅读 · 0 评论 -
HDU - 4763 Theme Section KMP
题意:给出一个字符串,找出一个尽可能长的子串,要求其在字符串的开头结尾中间都出现且不能有重叠。 KMP 先对主串跑出next数组,然后对于ptr = n,从nxt[n]开始,判断s.substr(nxt[ptr], n - 2*nxt[ptr])里是否出现了 s.substr(0, nxt[ptr]);如果没有则ptr = nxt[ptr]直到ptr == 0; 这里每个nxt[ptr]必有 s.substr(0, nxt[ptr]) == s.substr(n - nxt[ptr], nxt[ptr]),原创 2017-02-16 18:25:05 · 639 阅读 · 0 评论 -
HDU - 2457 DNA repair AC自动机+dp
题意:给出n个模式串,给出一个主串,要求在主创上改动尽可能少的字符,使任一模式串不在主串中出现。 AC自动机+dp 按照一般的 AC自动机+dp转移 的模式(套路)来做,与1月底做的一个经典例题题差不多 URAL - 1158 Censored! AC自动机+dp http://blog.csdn.net/prolightsfxjh/article/details/54729646 定义dpij表示主串上si字符自动机上的j节点时的最少方案。 如果自动机上j节点的下一个节点ac.ch[j][k]; 0 <原创 2017-02-16 17:51:17 · 690 阅读 · 0 评论 -
HDU - 2890 Longest Repeated subsequence 后缀数组+二分+贪心、不可重叠子串、离散化
题意:给出一个序列,要求找出出现过至少m次的最长(连续)子序列,求其最长长度和具体字典序最小的序列,且不能有重叠。 后缀数组+二分+贪心 先离散化,然后跑出后缀数组sa和height数组,然后二分答案,检查的时候,维护height[i] > mid 的sa[i]值及个数,日光个数大于等于m, 则把这段区间的sa[i],排序,然后从小的开始贪,相邻的2个,如果间隔小于mid,则去掉大的比去掉小的sa[i]更好,然后讨论下一个, 最后判断剩余的sa[i]的两两间隔不小于mid的sa[i]的个数大于等于m,则这就原创 2017-02-19 00:01:41 · 882 阅读 · 0 评论 -
HDU - 3948 The Number of Palindromes 后缀数组+ST表、distinct substring
题意:给出一个字符串,求出其回文子串的种数。 后缀数组+ST表 把s变成 s + '#' + s',其中s'表示s的反向串。 所以当回文子串的长度为奇数时 [i+1, _rank[n - sa[i] - 1]] 的height最小值表示以s[sa[i]]为中心的回文子串的最大半径(算上中心); 长度为偶数时 [i+1, _rank[n - sa[i]]] 的height最小值表示以s[sa[i]]为半径起点的回文子串的最大半径; 找这个最大半径,可以用ST表O(nlogn)的预处理出,然后每次O(1原创 2017-02-22 23:11:54 · 900 阅读 · 0 评论 -
HDU - 3695 Computer Virus on Planet Pandora AC自动机+优化
题意:给出n个模式串,然后给出一个主串(不过给出的形式是[number]char[number]char),求在主串中模式串或者模式串的逆串能匹配的个数。 AC自动机+优化 用n个模式串建立AC自动机,然后按照主串正反读2遍就好了,然后就是注意优化,即避免重复访问,碰到危险节点计算以后就标记为-1,这样下次如果再遍历到自动机的这里就直接break然后去遍历主串的下一个字符就好。此外,常用的AC自动机的写法是用map<char, int> mp;来储存字母表的,这里要改成s[i] - 'A'直接上,比较前者是原创 2017-01-28 22:14:45 · 1067 阅读 · 0 评论 -
HDU - 5384 Danganronpa AC自动机、简单题
题意:给出n个主串、m个模式串,求每个主串Ai中这m个模式串出现的次数和。 AC自动机、简单题 把n个模版串丢到一个队列里,然后读取m个模式串建立AC自动机,然后每个主串,按主串在AC自动机上遍历即可。注意此时的危险节点只能是模式串的结尾。 复杂度 O(n*length)原创 2017-01-28 23:30:48 · 615 阅读 · 0 评论 -
HDU - 6203 ping ping ping LCA倍增算法+dfs序+线段树
题意:给出一颗以0为根有n+1个节点的树,给出p个条件,每个条件表示u,v之间有一个坏的节点,根据这p个条件求出树上至少有多少坏点。 LCA+dfs序+线段树 先跑出dfs序,并对LCA进行预处理。 然后把每组条件按照u,v的LCA为第一优先级丢到优先队列里, 且对于dfs序有个性质,如果P是U的祖先,则 p1[P] <= p1[U] <= p2[U] <= p2[P], 故每次对于每个LCA(u,v),u,v : 先判断 u,v是否存在被标记的祖先,如果都没有说明需要新标记一个点为坏点,即把LCA(u,v原创 2017-10-16 15:37:44 · 880 阅读 · 0 评论