
数据结构
luyuncheng
luyuncheng@sina.com
展开
-
poj2406
此题略微坑爹。。。我用后缀数组做+rmq优化lcp 直接爆mle 如果用论文上的做也是tle 我自己本机生成了1组长1000000数据用以上两种方法测时间1组数据就到1s+了此题后面我有dc3做了 一直爆wa 我自己对拍了1个G的数据都找不到错。。。我还把字符都换成unsigned char 也还是找不出错误。。坑爹了。。后来还是得用kmp。kmp的做法和la3026差不多。。那题还难原创 2013-03-14 09:11:32 · 869 阅读 · 0 评论 -
cf266e More Queries to Array
此题由于K和L是变量不好维护,那么需要全部化简出来然后来维护参见:链接 csdn不好贴公式啊。。这个大神写的思想很好理解啊。。就维护不变值就好了附上比赛的官方题解:链接原创 2013-04-01 18:09:55 · 717 阅读 · 0 评论 -
hdu4534
此题是ac自动机+状态压缩dp由于按要求的各个串的长度不超过8个,所以可以用状态压缩来表示各个串的状态dp【i】【j】【k】【2】其中i代表长度i的串,j代表节点,k代表必须选择的串的每个串的选择状况,其中dp代表删除的值,2一个代表删除的个数,一个代表同时的价值那么转移就是dp【i】【j】【k】【0】=min(dp【i-1】【pre】【prek】【0】+1)如果删除一个字符的状态比删原创 2013-04-02 13:50:52 · 594 阅读 · 0 评论 -
spoj8222
此题一开始把自己绕进去了。一直不知道为什么要从后往前扫。后来想了个dfs,然后经人点醒才知道绕出自己的圈子因为一个节点到他的可能是长串也可能是短串,即比那个短的串,那么只要统计到这个点的最大数就好了其实从后往前扫类似于递推,一直搜到根节点从根节点出发到当前节点的所有路径即出现次数,那么统计各个长度,然后由于每个长串包含短串,所以最后dp就好了http://blog.youkuaiyun.com原创 2013-03-19 21:05:18 · 1032 阅读 · 0 评论 -
spoj7258
此题是求第k大子串因为自动机本身就包含所有的子串,然后边又是有字典序的,且我们可以通过dp知道某个节点后可以拓展出多少个子串由于每个节点都是自己的子串,所以初始化计数的时候为1那么我预处理出各个点与k的关系,然后在自动机上跑的话就直接字典序,边跑边判K,然后这样输出就好了扫到最后的时候需要k--因为本身也是一个串还是用top扫我们可以建一颗类似于字典树的扫描,那么对原创 2013-03-20 14:41:55 · 968 阅读 · 0 评论 -
cf269d
此题用线段树维护每插入一个隔板后能重叠的长度,注意离散化,然后用dp维护最大值就好了。官方题解:链接原创 2013-04-03 16:00:33 · 597 阅读 · 0 评论 -
cf235c
此题神犇clj出的题目啊。。。。题解见:http://codeforces.com/blog/entry/5592此题要求循环的啊。。首先一开始想的是将s赋值一次,但是那样建立出来的就不全是s的子串了那么反过来想,即:xi的各种形态中肯定有s的子串也是可以的所以首先预处理出各个节点的子串个数即从根节点开始扫到各个点的次数然后在dp一遍,统计。 此处dp统计可以用sort可以用t原创 2013-03-21 14:53:16 · 906 阅读 · 0 评论 -
cf243d
此题有样例都看了好半天。。参考:http://blog.youkuaiyun.com/acm_cxlove/article/details/8218610 http://blog.youkuaiyun.com/dslovemz/article/details/8203366原题中:the cube tower that stands on the unit square with原创 2013-04-03 19:20:02 · 600 阅读 · 0 评论 -
hdu4436
此题sam做是很容易的递推的时候记录两个值,到达这个结点的方案数way以及到达这个状态的数字之和sum。每次接收一个c转移显然就应该是给下一个结点的sum加上把这个式子的常数c拉出来就是亦即参考:http://edward-mj.com/?p=835但是我不是用他那种sort的方法。。。由于先刷的spoj所以我同样是先top一遍就这样从前往后推一下就好了,最后把每个原创 2013-03-20 17:11:32 · 717 阅读 · 0 评论 -
uva11488
此题算是水题把。。。只需要记录走过的时候经过这个节点的次数和长度,因为用数组模拟的所以我记录了长度。。。用指针就不用了。。。数组规模分析清楚点。。。开始开小了wa了。。原创 2013-04-03 21:52:25 · 785 阅读 · 0 评论 -
cf283e
此题一开始没懂题目中给的ai和bi是什么意思,一直以为是给定两个牛的成绩互换,后来貌似看到别人的解说是ab两端区间的牛的成绩都要换。。。后面就好做了转换为求补集,所有的组合数为C(n,3),那么我们求不满足的个数。不满足的情况是存在一个配对中,1个牛战胜了2个牛。那么就是对于每个牛,判断能胜的牛的个数设为m,那么就减去C(m,2),用线段树来维护对于这头牛可以赢的情况,算赢的情况是:对于当原创 2013-04-05 20:30:02 · 797 阅读 · 0 评论 -
spoj1812
此题困扰了我一天。。。今天才得以解决啊。。问了两位大神才得解。一直没搞懂为什么要对长度进行统计然后就是dag有序了首先sam就是一个dag的图,为什么是dag呢,由于自动机从根出来的每一路径都是一条子串,那么必定无环,则一定是个dag这个也是性质之1只是之前一直没懂为什么然后对于len的长度排序,因为因为根据dp拓扑性,len小的在前面,那么统计每个len,然后计数排序以后就可以算是t原创 2013-03-19 15:32:35 · 1575 阅读 · 0 评论 -
SPOJ220
此题就是按paper上做但是要考虑对于每个串都要有重叠,那么我就要对于每个串都考虑一遍最大值和最小值,就像poj1743那个只需要考虑两个那么此处考虑就将所有的情况都扫描一遍,看最大值和最小值只差是否大于访问长度,如果成立,那么就看有多少个成立的,如果是n个成立的那么就直接反回1了否则返回0;原创 2013-03-17 16:11:12 · 674 阅读 · 0 评论 -
poj3261
此题直接二分答案,然后统计长度是否不小于k,只要不小于看代表这些后缀是成立的。那么反回true记得这里有个处理是如果匹配失败记得把统计清0原创 2013-03-13 17:33:19 · 893 阅读 · 0 评论 -
ural 1297
此题用后缀数组做时,我在想。。我有个疑问的。即如果给定一个串,那么如果我要字典序怎么搞?是否是我按照suffix的顺序搜串呢?还是暴力点将所有的长度串存到map里面在依次输出?此题解法就是最长公共子串的解法,没什么多说的。算是模版,处理rmq。还有一种o(n)的做法是求最长回文子串的:http://blog.youkuaiyun.com/tanhaiyuan/article/details/709原创 2013-03-13 21:29:10 · 604 阅读 · 0 评论 -
kmp 总结篇
作者:July。出处:http://blog.youkuaiyun.com/v_JULY_v/。引记 此前一天,一位MS的朋友邀我一起去与他讨论快速排序,红黑树,字典树,B树、后缀树,包括KMP算法,唯独在讲解KMP算法的时候,言语磕磕碰碰,我想,原因有二:1、博客内的东西不常回顾,忘了不少;2、便是我对KMP算法的理解还不够彻底,自不用说讲解自如,运用自如了。所以,特再写本篇文转载 2013-03-02 20:00:24 · 593 阅读 · 0 评论 -
spoj687
此题想了我好久啊。。硬是没相通如果左边怎么匹配。paper上只说了匹配右边假设一个长度为l的子串重复出现两次,那么它必然会包含s[0]、s[l]、s[l*2]...之中的相邻的两个。不难看出,该重复子串必然会包含s[0..l]或s[l..l*2]或s[l*2..l*3]...。所以,我们可以枚举一个i,对于每个i*l的位置,利用后缀数组可以求出s[i*l..(i+1)*l]向后延伸的长度k原创 2013-03-14 21:49:38 · 1231 阅读 · 0 评论 -
poj3693
此题和spoj687做法一样,paper上的写法已经说明了,处理左端点我在spoj687那题也说了。这里想说下这题的输出。我一开始一直想如何按字典序输出,看网上的有暴力的有记录搜索的我觉得此题要理解后缀数组的意义,后缀数组的已经是按字典序记录好的。那么我只需要记录在最大次数下的所有可行的循环节,然后通过这个去找,且可以从字典序直接开始找,找到就可以直接退出了。因为后缀数组已经排序好了。那么原创 2013-03-15 10:49:59 · 1418 阅读 · 0 评论 -
ural1517
此题和前面题意差不多。也是paper上的 关键是要输出来。输出其实很简单,只要记录那个位置就好了。然后通过位置输出。但是中间需要加入一个特殊字符在整个长的串中。原创 2013-03-15 14:14:51 · 759 阅读 · 0 评论 -
spoj1811
为什么notonlysuccess说dc3可以卡过呢??我写的dc3怎么就一老超时呢呢呢呢呢呢。。。。为了a这题。。。我特意花了一天才懂后缀自动机啊。。。坑爹的后缀自动机啊。。发明的人脑袋是什么结构啊!!! 各种转啊 什么后缀啊的后缀啊啊 前缀的前缀啊啊。。。。!!!先给出后缀自动机的资料clj的ppt:http://download.youkuaiyun.com/detail/luyunch原创 2013-03-15 15:57:32 · 923 阅读 · 0 评论 -
poj3294
此题就是uva11107 我开始看paper以为是求不小于k的,那么做法和uva11107的做法是一样的,只是要开动变量为k,但是看了题目。。就是一样的http://blog.youkuaiyun.com/luyuncheng/article/details/8665656原创 2013-03-16 21:28:05 · 1034 阅读 · 1 评论 -
poj1226
此题我打印的论文不知道是不是出问题了,写的是poj3294.估计是改错了。因为poj3294前面出现过,不是这类题然后此题几乎也没有什么特别的。此题在扫描两个区间的时候注意限定不要让右边段的下标越界了,我就是因为这个原因调试了好久原创 2013-03-17 16:13:25 · 904 阅读 · 0 评论 -
poj3415
此题按照paper上说的做,而且要用到单调队列维护,此题paper上说用单调栈,其实就是单调队列的思想,用单调队列维护区间段的的值,首先用height预处理出满足k条件的,然后将sa按左右区分,最后分别扫ab两段,从头到尾,用优先队列维护次数的最大值原创 2013-03-18 08:12:43 · 908 阅读 · 0 评论 -
cf240f
此题是线段树做法有点类似hdu3954,我将每个长度中各个字符的个数存进去,这样有点暴力,即每个节点开个字符数组,有点类似于字典树,,然后我用线段树维护各个区间中的各个字符个数之所以只要委会字符个数,因为我输出的时候只要按字典序输出,然后判断下两边个数就好了。此题是把所有的询问都给出来,所以可以离线的处理维护的时候需要注意不成立的情况。即我们在更新线段之前注意判断是否能称为回文串然原创 2013-03-22 17:46:57 · 745 阅读 · 0 评论 -
cf228d
此题貌似暴力就可以了。。但是那个数学式子确实看了我半天啊。。。实在没懂。然后由于此题看到有人是用线段树做的。所以想YY一下怎么用线段树做。后来看到:http://blog.youkuaiyun.com/gotoac/article/details/8028313 给的方法相当巧妙,自己推了一下。博主思维很强大。。自己想不到啊。。。如果想看线段树的方法看他的博客把,挺详细的。。这里只是个传送门啊。。原创 2013-03-23 16:18:08 · 596 阅读 · 0 评论 -
cf85d treap
此题正解应该是bst 出题人的blog:http://www.codeforces.com/blog/entry/2021我看到有人有vector+二分查找过了的。如果二叉搜索树的深度在多一点,二分估计也难过啊我的做法略微暴力,但是使用treap来维护的暴力每个节点维护5个长度的和,那么根节点的sum5个值是由左右节点的5个值加上来的,由于只要求中间那个值和,所以我先加上左边的,那么右原创 2013-03-27 19:06:30 · 716 阅读 · 0 评论 -
cf256e
此题算是线段树维护的dp其实单纯想很容易,对于一个对于以i节点开始,j节点结束,那么其方案数就是dp【i】【J】=dp【i】【K】*dp【L】【J】其中保证(K,L)这个对是符合要求的就可以了,那么由于区间较大,就用线段树来维护就好了。。。我写的中规中矩,没加优化是2000ms+,但是貌似可以优化,由于我是递推上来的,那么有些pushup其实是不必要的。还有就是处理好清空的情况,即设置为0原创 2013-04-10 19:56:51 · 662 阅读 · 0 评论 -
ural1028 poj2352
此题用bit或者用线段树再好不过了。但是为了练习treap就用treap写了。treap写的是拼人品。。。seed不同就wa到死唉。。此题其实由于保证了Y轴是递增的。那么我就可以从点开始扫描,那么我只有维护一个X轴,然后凡是在其左下的都可以统计起来,然后hash一下就好了额。。这里本来想用map做hash一直wa。。。后来写了个数组爆hash 由于n不大,所以可以这样写。。。也不知原创 2013-03-28 12:28:25 · 569 阅读 · 0 评论 -
hdu 4117 AC自动机 + DP+线段树
此题着实蛋疼。。。。 写了个简单的dp 我居然交了20次代码后有个ac出现。。。。不知道此题数据是不是现场随机生成在跑的。。。题意:给定n个字符串,每个串都有个权值,找出若干个字符串组成一个序列,前面一个字符串是后面一个字符串的子串,问我们能获得最大权值和?首先dp方程应该好想吧 到dp[i] 到以第i个串结尾的最大权值和首先把所有串一起加入trie建自动机, 那么fail指针指向的所原创 2013-09-29 22:10:30 · 1391 阅读 · 0 评论 -
hdu 4747
这题思路有点纠结啊啊啊啊啊!!! 类似于今年多校的线段数,多校的时候是固定左端点,此处是固定右端点。。。这类题还是要多想想维护啊。。。。考虑一组数,那么最小的肯定是0,1,2...递增的数,那么首先预处理出1到n的mex值(表示从1到i的区间mex值为多少),然后我要记录以后当前值得后一个与其相同的值得位置,用next【i】表示,这里为什么,后面再说然后考虑从L 到 R 位置,原创 2013-09-16 23:31:14 · 1453 阅读 · 0 评论 -
cf 163e e-Government
此题是那次做了GRE的题目后,相同做法的题。先接着上次说的说说fail树吧:考虑把fail的指针反向建边,由于对于fail节点每个节点所指向的fail唯一,根据fail的原理,我们会从某个节点返回到root,所以fail的反向建边后性质就成了个fail树,这个树表示的是对于如果访问到某个子节点,那么他的祖先节点必然可以作为子串出现,那么鉴于此,我们要统计子串访问多少次,就是该节点返回到root原创 2013-10-02 20:04:36 · 1073 阅读 · 0 评论 -
Code Forces Round 201 B Lucky Common Subsequence 拓展提问
这题原题的思路就是dp+kmp在此我有个小问题。。。如果这题的virus换成多个串,那么题目就可以是不能同时满足所有的virus 和不能满足对于任意的virus之和 那么我们该怎么用ac自动机来匹配呢?我的开始想法是把多个virus建到自动机上去,然后在用同样的dp方程来匹配但是感觉有点写不动。因为对于不能同时满足所有的virus 那么我们直接把所有的virus看成一个串建自动原创 2013-10-07 16:27:14 · 1232 阅读 · 0 评论 -
bzoj 1146树链剖分
我用的是此题的树链剖分方法,此题时限50S。。。。首先将树按链重新标号,然后将一段链给放到线段树中取。由于求u到v的k大值,那么我们可以对于一段链中二分查找对于某一个值小于这个值的个数有多少个,那么我们就可以知道这个值如果恰好是第k大的就是答案所求。用线段树的话可以将一段区间的值快速求出来实现就是对于线段树表示表示区间的节点,对于那一段区间我们建立一个二叉搜索树(我用的treap,用于统计原创 2013-11-29 14:56:53 · 2169 阅读 · 0 评论 -
cf 120 c,d,e STL Non-Secret Cypher Counter Attack
c题:建立一棵树,对于每个跟节点表示一个pair然后子节点是pair或者int叶子节点必然为int 加判断一下就好了D题:可以想对于一个右边已经定下的点,只要前面有个数大于k个那么就可以统计这个所有之前的位置都是满足条件的2 3 4 5 6 1 1 1.。。。。。假设k是3 那么在第三个1的位置可以匹配的个数就是2,3,4,5,6,1都可行。首先离散化一下值原创 2013-10-08 20:22:40 · 1163 阅读 · 0 评论 -
cf219e
此题困扰时间甚长啊。。。一开始看题目。。。标题就是那个46d,估摸着也是区间合并。。。果不其然。。。然后就像这题算是点更新,相对于那题是段更新。。。果断就照46的往里写。。结果样例都过不去。。。后面自己手工模拟了下。。。发现当两端都取完的时候要取中间。。。然后中间1个为1一个为2的时候视为同一情况,可以自己手工模拟下样例然后我就一直在想如何维护两端和中间按那题的做法那么我无论怎么样原创 2013-04-10 16:07:12 · 827 阅读 · 0 评论 -
hdu4268
·此题是简单的treap的应用,所以set足够了。其实就是贪心。想想要覆盖最多,那么只需要用最小的h和最小的w去覆盖就好了。今天用set写了,明天试试用treap写了。自己试试完善treap 即实现lowerbound和upperbound原创 2013-03-27 20:47:17 · 698 阅读 · 0 评论 -
generator
这个题目有两题一个是:la3490 即zoj2619 此题 还有一题是hdu3058 这个算是前一题的进阶版,但是其长度要段些。然后说下此题解法,是参照俞勇的那本书写的。先给出:然后说明如下:F【i】记为从i状态到达L状态期望的步数c【i】【j】表示从i状态末尾加第j个大写字母后,得到的新状态是什么然后做的时候由于除n有可能丢失精度,那么两边同时*n就好做了。对于la349原创 2013-04-07 16:06:39 · 868 阅读 · 0 评论 -
cf213e
此题用整数hash+线段树处理线段树维护的是b数组的hash值首先用整数hash处理出a串的hash值,那么到时候匹配的时候就只用匹配整数的hash值就好了例如a串:1 2 3 。b串是1 2 3 4那么就用两种匹配方案。一个是1 2 3 一个是 2 3 4 那么我在处理2 3 4的hash的时候就需要将1的hash值减去,这一段用线段树来维护怎么维护呢,由于最大数不超过n,那原创 2013-03-25 12:14:59 · 649 阅读 · 0 评论 -
poj1442
最近一直在看treap,看了书上的用treap实现名次树,然后就做了这题。此题是哪来写名次树练手的例题,比书上那个容易多了,但是可以练下手开始的时候没看清题啊啊啊。。就照着书上的去敲,书上那题是求第k大值,此题求第k小值。。果断错了。。但是坑爹的是我居然乱搞a了。。因为我开始敲错了。。。我将左旋和右旋搞反了。。结果就弄巧成拙的过了。。。额额额。。。后面看书上的和我写的是反的。。我还一直质疑原创 2013-03-25 20:46:32 · 862 阅读 · 0 评论 -
hdu1828poj1177线段树周长并
详情请见国家队1999陈宏论文#include#include#includeusing namespace std;struct point{ int x,y;};struct rectangle{ point a,b;};struct node{ int aa,bb;//左右端点值 int left,right;//左右端点编号 int flag原创 2012-10-07 19:52:28 · 678 阅读 · 0 评论