09 2014 档案
摘要:最长公共子串问题的后缀数组解法。将第二个字符串拼接到第一个字符串中去,中间用分割符隔开,避免后面计算的时候发生一个字串横跨两个字符串的情况。之后看相邻的不在同一个字符串中的lcp的最大值即可。#include #include #include #include #include #include ...
阅读全文
摘要:这题曾经用KMP做过,用KMP 做非常的简单,h函数自带的找循环节功能。用后缀数组的话,首先枚举循环节长度k,然后比较LCP(suffix(k + 1), suffix(0)) 是否等于len - k, 如果相等显然k就是一个循环节。得到LCP的话可以通过预处理出所有点和0的lcp就好了。另外倍增法...
阅读全文
摘要:本题是利用后缀数组求最长的回文串。方法是将字符串反转之后拼接到原来的字符串末尾,中间用一个没有出现过的分割符隔开,原因是防止最长公共前缀横跨两个串。之后分别枚举回文串的中点,以及回文串长度是奇数还是偶数,看一下对应位置的最长公共前缀即可。这里的求最长公共前缀要处理RMQ问题,线段树固然可以解决,但是...
阅读全文
摘要:后缀数组求不同子序列数量的简单题。对于一个已经处理好的后缀数组,对于每一个suffix(i),必然会产生len - sa[i]个前缀(假设从0开始), 然后这len - sa[i]个前缀里面有height[i]个是和前面那个前缀相同的,所以是len - sa[i] - height[i]个,求一下和...
阅读全文
摘要:用后缀数组求重复出现至少k次的可重叠最长子串的长度,当然是可以用hash搞的,用后缀数组的话,只要在分组之后看看个数是不是大于等于k#include #include #include #include #include #include #include #include #include usi...
阅读全文
摘要:最简单的后缀数组求最长不可重叠的重复字串长度的问题。。具体见论文《后缀数组——处理字符串的有力工具#include #include #include #include #include #include #include using namespace std; #define MP make_...
阅读全文
摘要:如果题意明确了的话就是一个简单bfs。。。。。。用优先队列搞一下还是很快的。#include #include #include #include #include #include #include #include #include #include #include #include #inc...
阅读全文
摘要:首先对于一棵树,如果要求点u->v路径上的边权值的1的个数为奇数的话,相当与异或和为一,而u->v的值始终与1->u xor 1->v 相等有了这个性质之后,直接选一个点为根,dfs遍历整颗树,就可以求出根节点到其他所有节点路径上的异或和了。然后题目所要求的方案数相当与从所有为0的路径中和所有为1的...
阅读全文
摘要:维护一个斜率的绝对值递增的单调栈,然后正反各搞一遍即可。#include #include #include #include #include #include #include #include #include #include #include #include #include #incl...
阅读全文
摘要:终于学会倍增法了, 先一个最水最水的后缀数组应用。#include #include #include using namespace std;const int maxn = 1e6;char buf[maxn];int str[maxn], len, sa[maxn];inline int id...
阅读全文
摘要:= = 现在才会写,感觉有点怂就是一位一位的比较,对于每一位,使用计数排序,然后排序就好了,而且显然这是一种稳定排序算法。#include #include using namespace std;const int maxn = 1005;int num[maxn], n, bid[maxn], ...
阅读全文
摘要:原本是《后缀数组——处理字符串的有力工具》论文中的第一道例题,发现自己智商不够,一个下午没有看懂后缀数组= =,就用hash写了#include #include #include #include using namespace std;typedef long long LL;const int...
阅读全文
摘要:一开始写了一发很快的,发现一会能过一会不能,貌似有点悬,毕竟是随机算法。后来重写了一发迭代5遍的,基本上把把AC了= =模拟退火果然是一种不是很靠谱的算法。#include #include #include #include #include #include using namespace st...
阅读全文
摘要:网赛的时候感觉可以用模拟退火搞但是不会写,今天学了一下感觉模拟退火本身也不是很难= =#include #include #include #include using namespace std;const double eps = 1e-8;const double r = 0.99; //降温...
阅读全文
摘要:水题,证明有单调性之后直接照着拍就好#include #include #include #include using namespace std;#define sq(x) ((x)*(x))const int maxn = 10005;const int maxm = 5005;int f[ma...
阅读全文
摘要:这里的w显然满足速递变形不等式的规则,所以用四边形加速即可#include #include #include using namespace std;const int maxn = 1005;const int maxm = 1005;int w[maxn][maxn], sum[maxn], ...
阅读全文
摘要:开学没什么事情,抽出了一点时间学了一下python的最基本的东西,版本是python 2.7.8 通过内置变量__name__可以知道自己现在是处于执行状态还是作为一个模块引入的。 使用help()函数可以查看模块的帮助文档,python会根据注释自动生成帮助文档 使用dir(__builtins__)可以查看所有内置函数,当然也可以用来查看别的模块中的内容,当然查看之前要先import...
阅读全文
摘要:第一次写四边形不等式的题,现在的理解就是用各种东东缩小了k的范围,从而使复杂度降低到n^2需要满足的条件是对于i#include #include #include #include #include #include #include #include #include #include usin...
阅读全文
摘要:单独把每个字母第一次出现和最后一次出现拿出来处理一下就好#include #include #include #include #include #include #include #include #include #include #include #include #include #incl...
阅读全文
摘要:最优情况不可能跨过一种灯泡,为什么? 因为如果A换成C是划算的那么如果A换成B是不划算的那么可以将A和B都换成C,肯定是划算的= =然后就是简单DP了。#include #include #include #include #include #include #include #include #i...
阅读全文
摘要:背包可行性 有点SB,wa了好几发#include #include #include #include #include #include #include #include #include #include #include #include #include #include #includ...
阅读全文
摘要:DP,对于输出字典序最小方案直接反着递推就好了。#include #include #include #include #include #include #include #include #include #include #include #include #include #include ...
阅读全文
摘要:双调欧几里得问题,复习一下。。把所有的点按照x排序,设计状态f(i,j)表示走在前面的那个走到了i点,后面那个在j点,所需的最小,那么转移显而易见。f(i,j) = min(f(i - 1,j) + dist(i,i - 1), f(i,i - 1) + dist(i,j))直接顺着推过去可能好理解...
阅读全文
摘要:简单DAG,每个状态有三种决策,原地傻等,上往左开的车,上往右开的车。#include #include #include #include #include #include #include #include #include #include #include #include #includ...
阅读全文
摘要:感觉可以用BFS撸,然后就撸了,样例无限不过,代码能力真是弱。。#include #include #include #include #include using namespace std;const int bufsize = 128;char buf[bufsize][bufsize];st...
阅读全文
摘要:一开始觉得是数位DP,后来想不出来。 但是感觉爆搜+剪枝可以过,于是就过了。。#include #include #include using namespace std;typedef long long LL;const int maxn = 50;int lim[maxn], len;LL n...
阅读全文
摘要:dfs+记忆化搜索,白书上给了一种很神的存答案的方式,要同时保存两个值,可以将一个值乘以一个大整数加上另外一个。具体状态转移见注释#include #include #include #include #include #include #include #include #include #inc...
阅读全文
摘要:感觉白书上的做法很神!首先状压表示电脑之间的联通关系,然后预处理出所有关闭电脑的组合达到的状态,然后枚举每个状态并且枚举每个状态的所有子集,之后无脑递推就木有了。关于枚举一个状态所有子集的小技巧:假设当前状态是S0有for s = s0; s != 0; s = (s - 1) & s0#inclu...
阅读全文
摘要:一开始看的时候没什么思路,后来一看卧槽不是简单的离线处理么。反着插入一遍然后直接查询就好了。#include #include #include using namespace std;#define lson rt > 1; build(lson); build(rson); ...
阅读全文
摘要:Hash在信息学竞赛中的一类应用中的某道例题"不难想到的算法是使用两个字符串分别表示两棵树,但是如果使用Hash的话应该怎么做呢?可以使用一种类似树状递推的方法来计算Hash值:对于一个节点v,先求出它所有儿子节点的Hash值,并从小到大排序,记作H1,H2,„,HD。那么v的Hash值就可以计算为...
阅读全文
摘要:Hash在信息学竞赛中的一类应用论文中的第一道例题,关于二维hash的一些处理方法和小技巧通过RK法计算hash值如果不取模的话可以O(n)预处理,然后O(1)得到任意一个字串的hash值得到任意子串的hash值的时候不能用除和取模运算了,显然是错的二维hash如果使用RK法每一次的p值必须不一样如...
阅读全文
摘要:直接默认hash不会冲突,其实很多现成的字符串hash算法是很优秀的。。。大概率可以水过。。。。然后从两端往中间搞一搞,特殊处理一下中间的情况就好。#include #include #include #include #include #include #include #include #inc...
阅读全文
摘要:感觉可以用bfs暴力,一开始写了一个很暴力的bfs,hash判重,本地跑了几组数据发现至少要2s才能过,交上去估计要TLE,试探性的交了一发1A了,原来时限是10s,我看成1s了,真是逗逼。。。还一直不敢写#include #include #include #include #include #i...
阅读全文
摘要:题意一开始不是很明确, 后来发现是每一种特征出现的次数相同这样一来就变成简单hash问题了,如果把每个特征看看做是一个(n+1)进制数的话,对奶牛序列求一下前缀和,如果i - j这一段每一种特征出现的次数相同的话,把i - 1点和j点的每一位减去所有位中的最小值之后,必然相等,所以hash判断一下就...
阅读全文
摘要:直接从前往后DP,因为一共只有500个数,所以累加起来的话单个数不会超过4096,并且因为是Flappy 2048的规则,所以只有之后数列末尾一串递减的是有效的,因此可以状压。1700ms = =,据说用滚动数组优化一下会好很多#include #include #include #include ...
阅读全文

浙公网安备 33010602011771号