摘要:
SPOJ_704 这个题目可以用AC自动机(其实应该说是trie图)+dp去做。 我们可以把问题等效成从X这个字符串里面挑出一些字符组成一个新的字符串,并且新的字符串中不能包含Y。我们可以把生成字符串的过程模拟成在trie图上行走的过程,则第i步时就会有两种选择,要么走到X[i]这个字符上,要么停留在原地,其中停留在原地就相当于把X[i]这个字符删掉了,因此代价应该增加1。为了保留第i步走到第j个点时的最小代价,可以用f[i][j]记录,当然空间可以优化成一维的。 最后我们把行走了len[X]步后的到达各个节点的最小代价统计一下,输出最小值即可。#include<stdio.h># 阅读全文
摘要:
POJ_2528 首先说明一点,直接离散化海报的端点是不行的,因为这样会默认把海报范围内的所有端点都覆盖掉后就算把海报覆盖了,然而实际上是不可以这样判断的。比如1 10、1 4、6 10这三张海报,尽管最后1、4、6、10都被覆盖了,但是5这个单位线段是没有被覆盖的,所以应该输出3。 为了避免上述的问题,我们在离散的话的时候可以选择将区间离散化,海报的端点算作一个区间,相邻两个端点之间也算所一个区间,那么上面的例子就被离散化成了1 1、2 3、4 4、5 5、6 6、7 9、10 10这样几个区间,还有更方便一点的做法,就是不去离散化区间,但是添加上海报端点左边的点,对于上面的例子离散化之.. 阅读全文
摘要:
HDU_2871 胡浩的博客上说这个可以做splay的热身题,结果写出来洋洋洒洒270行代码却落得TLE收场,不得不改成线段树去写了。 reset操作是最简单的,直接将根初始化并加个延迟标记即可。 我们可以用lc[](left contiguous)表示一个区间从左边开始连续有多少个空位,rc[](right contiguous)表示一个区间从右边开始连续有多少个空位,mc(max contiguous)表示这个区间内最长的连续的空位。有了这三个数组我们就可以很方便地实现New操作了。 对于Free操作,知道这个点是否是空位是很简单的,但为了获得Memory unit的左、右端点,我们... 阅读全文