左岸阳光

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  算法学习

cf,acm
摘要:二分写法很多,很容易写错,以后就固定下面的这种写法。首先二分的区间定为[x,y),然后mid值取下界x+(y-x)/2,循环条件是x<y。这样的好处是退出时x=y,有些问题里不用考虑是返回x还是y;而且在有些问题中,比如说插入的位置,可能会需要返回y这个位置。去下界是必须的,否则会访问到不在查询区间y位置。最后是剪短区间的地方,这个地方写错经常会导致死循环。由于选的mid是下界,mid不会等于y,所以不会出现[x,mid]=[x,y]的死循环情况,为了避免[mid,y]=[x,y]的情况,x更新的时候更新成x=mid+1。下面以递增序列为例写几种常见的二分。1需要返回value所在上限的 阅读全文
posted @ 2013-03-22 22:33 左岸阳光 阅读(1557) 评论(0) 推荐(0)

摘要:先来规定一些符号,S表示一个字符串,|S|表示字符串的长度,没有特殊说明n表示匹配串的长度,m表示模式串的长度。prefix(i)表示S的后缀S[i...n]。 zbox算法只是对一个字符串S求出一个数组Zbox[]。Zbox[i]表示的是prefix[i]和字符串S的最长公共前缀的长度。即zbox算法的目的是初始化所有字符串后缀对与原串的最长公共前缀长度。 先来看看通过Zbox[]数组如何进行精确匹配。匹配串记为S,模式串记为P。要用一个数组把S和P关联起来,一个常用的方法是把S和P连接。这里把P放在前面得到新串T = P+S。现在对新串进行zbox的过程求出Zbox[]。根据定义可... 阅读全文
posted @ 2012-12-31 18:36 左岸阳光 阅读(384) 评论(0) 推荐(0)

摘要:这个算法利用了位运算的优势速度很快,易于实现,缺点是模式串不能太长。据说在适用范围内速度是kmp的至少2倍。算法思想是用一个数字prefix的二进制去表示模式串的前缀,prefix的二进制第i位表示模式串的前缀0~i。如果这个前缀i是当前搜索到的匹配串的后缀时,将第i位至1。算法就是从匹配串的第0个字符到最后一个字符不断更新prefix的值每次更新后看最长的前缀(即模式串)的位是否被至1,如果是说明得到了一个匹配。 下面说明下更新的过程。假如求出了比较匹配串第j位时的prefix,现在求比较j+1位的情况:prefix第i位为1当且仅当prefix第i-1位为1(匹配了i-1个字符),并... 阅读全文
posted @ 2012-12-30 00:24 左岸阳光 阅读(1035) 评论(0) 推荐(0)

摘要:kmp被分类成基于前缀搜索的匹配算法,把模式串(要寻找的串)当作一个滑动窗口在匹配串上滑动,匹配顺序是从左到右。不论是基于前缀搜索,基于后 缀搜索,还是子串搜索,每次失配向后移动多个字符好像是这些单串匹配算法的共同特点。kmp的思想是每次失配或者匹配成功进行下一次匹配的时候,不像暴力 那样只移动一个字符之后重模式串头部匹配,而是每次最优的向后移动多个字符并且之后可以从失配的地方开始匹配。 为了实现这个,kmp初始化了每个模式串前 缀的最大边界,即代码中的nextjmp[],存的是边界作为模式串前缀的末尾下标。所谓字符窜的边界,是指既是字符窜的前缀又是字符窜的后缀的真子串 (不能是本身,否... 阅读全文
posted @ 2012-12-29 22:42 左岸阳光 阅读(439) 评论(0) 推荐(0)

摘要:A~B:我用的枚举两个数字组成的所有数,同时判重bool超内存了,用位压缩才过~C: 求n个数的一组序列连续从i到j或操作可能得到多少不同的数字。每个数字不超过10^6,即20位。所以或操作本质是向20位二进制的序列填1。对于每个数ai,枚举每位,向前(0的方向)或。如果该位为0,则向前或过程中其他数该位变化不会由该数引起,此时加入当前数直接退出;如果该位为1,向前或过程中其他位的变化可以contribute to这一个数,为了避免重复,向前或持续到其左边第一个位数为1的数处。对20位处理完后,直接输出判重后的结果(判重是相对于20个位之间)。对于同一位不会出现重复加入同一个数字。每个数最多重 阅读全文
posted @ 2012-11-21 18:16 左岸阳光 阅读(203) 评论(0) 推荐(0)

摘要:A,B两个水题。C:BFS求最短路,由于范围很大(1e9),而且实际的可走范围比较小,所以需要存储映射关系,类似稀疏矩阵的三元组 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <map> 5 #include <utility> 6 #include <queue> 7 #define LL long long 8 9 using namespace std;10 11 int dx[] = {0, 0, 1, -1, 阅读全文
posted @ 2012-11-13 11:45 左岸阳光 阅读(372) 评论(0) 推荐(0)