左岸阳光

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

2013年6月23日

摘要: 一 View C++ as a federation of language c++ 可以看成4部分组成:c Object-Oriented c++Template c++STL二 Perfer consts, enums, inlines to #defines*左表示所指不能改变,*右则表示指针不能改变类中的专属常量(static const)为了只有一份拷贝通常加static,因此需要类外增加一个定义式(类中是申明)类中的常量也可以用 the enum hack 的方法定义template inline函数可以替换宏函数三 Use const whenever possiblepas.. 阅读全文
posted @ 2013-06-23 19:14 左岸阳光 阅读(216) 评论(0) 推荐(0) 编辑

2013年3月22日

摘要: 二分写法很多,很容易写错,以后就固定下面的这种写法。首先二分的区间定为[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 左岸阳光 阅读(1516) 评论(0) 推荐(0) 编辑

2012年12月31日

摘要: 先来规定一些符号,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 左岸阳光 阅读(334) 评论(0) 推荐(0) 编辑

2012年12月30日

摘要: 这个算法利用了位运算的优势速度很快,易于实现,缺点是模式串不能太长。据说在适用范围内速度是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 左岸阳光 阅读(1006) 评论(0) 推荐(0) 编辑

2012年12月29日

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

2012年11月21日

摘要: 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 左岸阳光 阅读(189) 评论(0) 推荐(0) 编辑

2012年11月13日

摘要: 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 左岸阳光 阅读(364) 评论(0) 推荐(0) 编辑

2012年11月11日

摘要: 外中断是指那些不再CPU内部产生的中断,即通过端口与cpu通信的外设产生的中断。可屏蔽中断是CPU可以不响应的外中断不可屏蔽中断是CPU必须响应的中断,其中断类型码都是2sti,cli可以屏蔽中断,让一些如改变中断向量的操作安全进行。(1)下面程序在屏幕中某个位置一次输出A~Z,按ESC改变该位置颜色: 1 ;中断时的入栈顺序是pushf,push cs, push ip 2 assume cs : codesg, ss : stacksg 3 4 stacksg SEGMENT 5 dw 64 dup (0) 6 stacksg ENDS 7 8 9 10 codesg SE... 阅读全文
posted @ 2012-11-11 22:16 左岸阳光 阅读(1332) 评论(0) 推荐(0) 编辑

摘要: 这两个实验都需要操作软驱,也都只要用到dos系统。(1)对于实验15,要求在dos系统下运行实验程序,就要将exe文件转移到dos系统。我是这么做的,在vmware下给xp虚拟机设置一个dos软驱镜像(随便下一个),用WinImage将汇编,链接得到的exe文件导入dos软驱镜像。在启动虚拟机的时候设置启动项为floppy drive(软驱启动),就会启动到dos下,且可以运行导入的exe文件。(2)对于课程设计,可以先安装一个dos虚拟机,设置一个含有实验程序的软驱镜像。在启动虚拟机的时候设置启动项为floppy drive(软驱启动),就会自动运行你自己写的特别的程序。明天写实验~ 阅读全文
posted @ 2012-11-11 00:29 左岸阳光 阅读(436) 评论(0) 推荐(0) 编辑

2012年11月10日

摘要: 编写int 7ch中断例程,实现:清屏设置前景色设置背景色向前滚动一行要求ah寄存器传递功能号:0, 1, 2, 3对应上述功能;al传递颜色值,al->[0, 7].中断程序中的call,jmp都应该选择偏移类型的指令,因为标号地址是编译器在汇编或者连接时期计算的,用偏移量才能保证指令安装在别的地址也能正常运行。标号后无冒号只能出现在代码段,无冒号可以代表数据类型和地址,有冒号的标号只能代表偏移。 1 ;中断时的入栈顺序是pushf,push cs, push ip 2 assume cs : codesg, ss : stacksg 3 4 stacksg SEGMENT 5 ... 阅读全文
posted @ 2012-11-10 10:09 左岸阳光 阅读(1609) 评论(0) 推荐(1) 编辑