国家集训队2009论文集后缀数组——处理字符
NOIP2010集训小资料
NOIP2009集训小资料——章琨目录1.反约瑟夫问题2.空间的计算3.树的性质4.最大公约数5. Catalan数6.最短路floyed7.小技巧8.最短路SPFA9.move函数10.最长上升(下降)子序列[nlogn]11.字母树12.几类背包问题13.最长上升公共子序列14.树的遍历15.循环小数转分数16.字典序法求排列17.康托展开18.随机顺序19.最小区间覆盖问题20.K短路21. Fibonacci数列22.关键路径23.中缀转后缀24.后缀转中缀25.最小生成树Kruskal算法精华1.反约瑟夫环问题f[i]代表i个人报数,报到j的出局时最后出圈的人的序号f[1]=1f[i]=(f[i-1]+j-1) mod i+12.空间的计算每类型所占字节*1024*1024*个数(单位M)3.如果一个图中任意两点有且只存在一条简单路径那么它就是一棵树4.求最大公约数(欧几里德算法)=>链接function gcd(x,y:longint):longint;beginif y=0then gcd:=xelse gcd:=gcd(y,x mod y);最小公倍数*最大公约数=两数之积5. 卡特兰数=>链接通项公式:f[n]=)!1( !)!2(+⨯n n n = 23....)1()2()3(....)1*2(2⨯⨯⨯-⨯+⨯+⨯⨯-⨯n n n n n n 递推公式:f[n]=f[1]*f[n-1]+f[2]*f[n-2]+…+f[n -1]*f[1] n>=2 f[1]=1前十项6. floyed 求最短路=>链接For k:= 1 to n dofor i:= 1 to n dofor j:= 1 to n doif f[i,k]+f[k,j]>f[i,j] thenf[i,j]:=f[i,k]+f[k,j];中间值要放在外层循环7. 小技巧div 2 的时间长于 shr 1i:=i+1 的时间长于 inc(i)i:=i-1 的时间长于 dec(i)longint 比 integer 快8. SPFA 求单元最短路=>链接注意事项:[1]Next[i]代表在边集数组中下标为i 的边的同起点的边在边集数组中的下标[2]Dian[i]代表起点为i 的边在边集数组中的下标[3]无向边要分为两个有向边9. move 函数的用法(速度是循环的10倍以上)[考试时最好不要使用]Move[a[i],b[j],sizeof(类型)*k]代表从a 数组第i 位到第i+k-1位的部分赋值给b 数组第j 位到第j+k-1位10. nlogn 的最长上升(下降)子序列=>链接Shu[i]代表数列的第i 位F[i]代表以第i 项结尾的最长上升子序列的长度G[k]代表长度为k 的最长上升子序列的最小值(G[k]=min(shu[i]) i 满足f[i]=k) Len 为G 数组的尾指针主要步骤:[1]当shu[i]>g[len]那么尾指针后移1位,g[len]:=shu[i][2]当shu[i]<=g[len]那么在[0,len]这个区间二分查找shu[i]在[x,y]中则f[i]:=y 并更新g[y]:=i11. 字母树的建立=>链接Tree[i,ch]代表父亲节点为i 的点,本身字母为ch 的点的编号ge 为除根节点外节点个数可用于找公共前缀12. 各类背包问题的分析=>链接W 为费用 T 为价值[1]0/1背包For i:= 1 to n doFor j:=v downto 1 doIf f[j]<f[i-w[i]]+t[i] thenf[j]:=f[i-w[i]]+t[i][2]完全背包For i:= 1 to n doFor j:= 1 to v doIf f[j]<f[i-w[i]]+t[i] thenf[j]:=f[i-w[i]]+t[i][3]多重背包:将n[i]个物品拆成n[i]个后再进行0/1背包[4]分组背包For i:= 1 to n doFor j:=v downto 1 doFor k:= 1 to z doIf f[j]<f[i-w[k][i]]+t[k][i] thenf[j]:=f[i-w[k][i]]+t[k][i]13. 最长上升公共子序列=>链接F[i]代表b 序列尾位为i 时的最长长度F[i]=max(f[i`])+1 i`<i14. 树的3种遍历的顺序:先序遍历顺序:根节点—左子树—右子树中序遍历顺序:左子树—根节点—右子树后序遍历顺序:左子树—右子树—根节点15. 循环小数转为分数=>链接0.[ a ][ a ][ a ] [ a ]…… =9999......99999][aX 位 X 位0.[ b ][ a ][ a ][ a ] [ a ]……=00....100][000...99000...99][b a + Y 位 X 位 X 个9 Y 个0 Y 个0 注:[ a ]表示循环节16. 字典序法求下一个排列=>链接主要步骤:[1]从右往左找到第一个比右边的数小的数的编号j[2]在[j+1,n]中找到比a[j]大最小的数编号为k[3]交换j 和k 位置上的数[4]将区间[j+1,n]中的数倒转17. 全排列的项数与排列的转换求排列在全排列中的项数(康托展开):F[i]表示排列中的第i 位(从右往左)的右边有多少个数比比它小项数=)!1(][1-⨯∑=i i F ni求全排列的第i 项得排列把i 变为阶乘进制数 if f[i]>=I then begin f[i+1]:=f[i+1]+f[i] div I; f[i]:=f[i] mod I; end; 即!0]1[!1]2[......)!2(]1[)!1(][⨯+⨯++-⨯-+-⨯=f f n n f n n f I 第j 位为剩下的数中第f[j]+1小的数,然后依次还原排列18. 随机一个顺序时间复杂度O(n)枚举每一个点与随机到的位置交换19. 最小区间覆盖问题=>2008年周小博论文描述:有n 个区间,选择尽量少的区间,使得这些区间完全覆盖某线段[s,t] 算法:[1]按左端点坐标排序[2]每次选择覆盖点s 的区间中右端点坐标最大的一个,并更新s[3]直到所选区间已包含t20. 无向图中第K 短路的求法=>链接二分K 短路的长度每次求出长度小于等于二分长度的路径条数条数大于等于K 时右边界左移条数小于K 时左边界右移直到左右边界相差1,k 为1时输出x ;否则输出y21. Fibonacci 数列递推公式:f[i]=f[i-1]+f[i-2]通项公式:⎥⎦⎤⎢⎣⎡--+=n n n F )^251()^251(55][22. 关键路径算法步骤:[1]添加一个起点和终点,求出AOE 网中的拓扑序列,若有环工程无法开始。
NOI国家集训队论文分类(至2008)(摘抄自C博客)
摘抄自C博客组合数学计数与统计2001 - 符文杰:《Pólya原理及其应用》2003 - 许智磊:《浅谈补集转化思想在统计问题中的应用》2007 - 周冬:《生成树的计数及其应用》2008 - 陈瑜希《Pólya计数法的应用》数位问题2009 - 高逸涵《数位计数问题解法研究》2009 - 刘聪《浅谈数位类统计问题》动态统计2004 - 薛矛:《解决动态统计问题的两把利刃》2007 - 余江伟:《如何解决动态统计问题》博弈2002 - 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》2007 - 王晓珂:《解析一类组合游戏》2009 - 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》2009 - 方展鹏《浅谈如何解决不平等博弈问题》2009 - 贾志豪《组合游戏略述——浅谈SG游戏的若干拓展及变形》母函数2009 - 毛杰明《母函数的性质及应用》拟阵2007 - 刘雨辰:《对拟阵的初步研究》线性规划2007 - 李宇骞:《浅谈信息学竞赛中的线性规划——简洁高效的单纯形法实现与应用》置换群2005 - 潘震皓:《置换群快速幂运算研究与探讨》问答交互2003 - 高正宇:《答案只有一个——浅谈问答式交互问题》猜数问题2003 - 张宁:《猜数问题的研究:<聪明的学生>一题的推广》2006 - 龙凡:《一类猜数问题的研究》数据结构数据结构2005 - 何林:《数据关系的简化》2006 - 朱晨光:《基本数据结构在信息学竞赛中的应用》2007 - 何森:《浅谈数据的合理组织》2008 - 曹钦翔《数据结构的提炼与压缩》结构联合2001 - 高寒蕊:《从圆桌问题谈数据结构的综合运用》2005 - 黄刚:《数据结构的联合》块状链表2005 - 蒋炎岩:《数据结构的联合——块状链表》2008 - 苏煜《对块状链表的一点研究》动态树2006 - 陈首元:《维护森林连通性——动态树》2007 - 袁昕颢:《动态树及其应用》左偏树2005 - 黄源河:《左偏树的特点及其应用》跳表2005 - 魏冉:《让算法的效率“跳起来”!——浅谈“跳跃表”的相关操作及其应用》2009 - 李骥扬《线段跳表——跳表的一个拓展》SBT2007 - 陈启峰:《Size Balance Tree》线段树2004 - 林涛:《线段树的应用》单调队列2006 - 汤泽:《浅析队列在一类单调性问题中的应用》哈希表2005 - 李羽修:《Hash函数的设计优化》2007 - 杨弋:《Hash在信息学竞赛中的一类应用》Splay2004 - 杨思雨:《伸展树的基本操作与应用》图论图论2005 - 任恺:《图论的基本思想及方法》模型建立2004 - 黄源河:《浅谈图论模型的建立与应用》2004 - 肖天:《“分层图思想”及其在信息学竞赛中的应用》网络流2001 - 江鹏:《从一道题目的解法试谈网络流的构造与算法》2002 - 金恺:《浅谈网络流算法的应用》2007 - 胡伯涛:《最小割模型在信息学竞赛中的应用》2007 - 王欣上:《浅谈基于分层思想的网络流算法》2008 - 周冬《两极相通——浅析最大—最小定理在信息学竞赛中的应用》最短路2006 - 余远铭:《最短路算法及其应用》2008 - 吕子鉷《浅谈最短径路问题中的分层思想》2009 - 姜碧野《SPFA算法的优化及应用》欧拉路2007 - 仇荣琦:《欧拉回路性质与应用探究》差分约束系统2006 - 冯威:《数与图的完美结合——浅析差分约束系统》平面图2003 - 刘才良:《平面图在信息学中的应用》2007 - 古楠:《平面嵌入》2-SAT2003 - 伍昱:《由对称性解2-SAT问题》最小生成树2004 - 吴景岳:《最小生成树算法及其应用》2004 - 汪汀:《最小生成树问题的拓展》二分图2005 - 王俊:《浅析二分图匹配在信息学竞赛中的应用》Voronoi图2006 - 王栋:《浅析平面Voronoi图的构造及应用》偶图2002 - 孙方成:《偶图的算法及应用》树树2002 - 周文超:《树结构在程序设计中的运用》2005 - 栗师:《树的乐园——一些与树有关的题目》路径问题2009 - 漆子超《分治算法在树的路径问题中的应用》最近公共祖先2007 - 郭华阳:《RMQ与LCA问题》划分问题2004 - 贝小辉:《浅析树的划分问题》数论欧几里得算法2009 - 金斌《欧几里得算法的应用》同余方程2003 - 姜尚仆:《模线性方程的应用——用数论方法解决整数问题》搜索搜索2001 - 骆骥:《由“汽车问题”浅谈深度搜索的一个方面——搜索对象与策略的重要性》2002 - 王知昆:《搜索顺序的选择》2005 - 汪汀:《参数搜索的应用》启发式2009 - 周而进《浅谈估价函数在信息学竞赛中的应用》优化2003 - 金恺:《探寻深度优先搜索中的优化技巧——从正方形剖分问题谈起》2003 - 刘一鸣:《一类搜索的优化思想——数据有序化》2006 - 黄晓愉:《深度优先搜索问题的优化技巧》背包问题2009 - 徐持衡《浅谈几类背包题》匹配2004 - 楼天城:《匹配算法在搜索问题中的巧用》概率概率2009 - 梅诗珂《信息学竞赛中概率问题求解初探》数学期望2009 - 汤可因《浅析竞赛中一类数学期望问题的解决方法》字符串字符串2003 - 周源:《浅析“最小表示法”思想在字符串循环同构问题中的应用》多串匹配2004 - 朱泽园:《多串匹配算法及其启示》2006 - 王赟:《Trie图的构建、活用与改进》2009 - 董华星《浅析字母树在信息学竞赛中的应用》后缀数组2004 - 许智磊:《后缀数组》2009 - 罗穗骞《后缀数组——处理字符串的有力工具》字符串匹配2003 - 饶向荣:《病毒的DNA———剖析一道字符匹配问题解析过程》2003 - 林希德:《求最大重复子串》动态规划动态规划2001 - 俞玮:《基本动态规划问题的扩展》2006 - 黄劲松:《贪婪的动态规划》2009 - 徐源盛《对一类动态规划问题的研究》状态压缩2008 - 陈丹琦《基于连通性状态压缩的动态规划问题》状态设计2008 - 刘弈《浅谈信息学中状态的合理设计与应用》树形DP2007 - 陈瑜希:《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》优化2001 - 毛子青:《动态规划算法的优化技巧》2003 - 项荣璟:《充分利用问题性质——例析动态规划的“个性化”优化》2004 - 朱晨光:《优化,再优化!——从《鹰蛋》一题浅析对动态规划算法的优化》2007 - 杨哲:《凸完全单调性的加强与应用》计算几何立体几何2003 - 陆可昱:《长方体体积并》2008 - 高亦陶《从立体几何问题看降低编程复杂度》计算几何思想2004 - 金恺:《极限法——解决几何最优化问题的捷径》2008 - 程芃祺《计算几何中的二分思想》2008 - 顾研《浅谈随机化思想在几何问题中的应用》圆2007 - 高逸涵:《与圆有关的离散化》半平面交2002 - 李澎煦:《半平面交的算法及其应用》2006 - 朱泽园:《半平面交的新算法及其实用价值》矩阵矩阵2008 - 俞华程《矩阵乘法在信息学中的应用》高斯消元2002 - 何江舟:《用高斯消元法解线性方程组》数学方法数学思想2002 - 何林:《猜想及其应用》2003 - 邵烜程:《数学思想助你一臂之力》数学归纳法2009 - 张昆玮《数学归纳法与解题之道》多项式2002 - 张家琳:《多项式乘法》数形结合2004 - 周源:《浅谈数形结合思想在信息学竞赛中的应用》黄金分割2005 - 杨思雨:《美,无处不在——浅谈“黄金分割”和信息学的联系》其他算法遗传算法2002 - 张宁:《遗传算法的特点及其应用》2005 - 钱自强:《关于遗传算法应用的分析与研究》信息论2003 - 侯启明:《信息论在信息学竞赛中的简单应用》染色与构造2002 - 杨旻旻:《构造法——解题的最短路径》2003 - 方奇:《染色法和构造法在棋盘上的应用》一类问题区间2008 - 周小博《浅谈信息学竞赛中的区间问题》序2005 - 龙凡:《序的应用》系2006 - 汪晔:《信息学中的参考系与坐标系》物理问题2008 - 方戈《浅析信息学竞赛中一类与物理有关的问题》编码与译码2008 - 周梦宇《码之道—浅谈信息学竞赛中的编码与译码问题》对策问题2002 - 骆骥:《浅析解“对策问题”的两种思路》优化算法优化2002 - 孙林春:《让我们做得更好——从解法谈程序优化》2004 - 胡伟栋:《减少冗余与算法优化》2005 - 杨弋:《从<小H的小屋>的解法谈算法的优化》2006 - 贾由:《由图论算法浅析算法优化》程序优化2006 - 周以苏:《论反汇编在时间常数优化中的应用》2009 - 骆可强《论程序底层优化的一些方法与技巧》语言C++2004 - 韩文弢:《论C++语言在信息学竞赛中的应用》策略策略2004 - 李锐喆:《细节——不可忽视的要素》2005 - 朱泽园:《回到起点——一种突破性思维》2006 - 陈启峰:《“约制、放宽”方法在解题中的应用》2006 - 李天翼:《从特殊情况考虑》2007 - 陈雪:《问题中的变与不变》2008 - 肖汉骏《例谈信息学竞赛分析中的“深”与“广”》倍增2005 - 朱晨光:《浅析倍增思想在信息学竞赛中的应用》二分2002 - 李睿:《二分法与统计问题》2002 - 许智磊:《二分,再二分!——从Mobiles(IOI2001)一题看多重二分》2005 - 杨俊:《二分策略在信息学竞赛中的应用》调整2006 - 唐文斌:《“调整”思想在信息学中的应用》随机化2007 - 刘家骅:《浅谈随机化在信息学竞赛中的应用》非完美算法2005 - 胡伟栋:《浅析非完美算法在信息学竞赛中的应用》2008 - 任一恒《非完美算法初探》提交答案题2003 - 雷环中:《结果提交类问题》守恒思想2004 - 何林:《信息学中守恒法的应用》极限法2003 - 王知昆:《浅谈用极大化思想解决最大子矩形问题》贪心2008 - 高逸涵《部分贪心思想在信息学竞赛中的应用》压缩法2005 - 周源:《压去冗余缩得精华——浅谈信息学竞赛中的“压缩法”》逆向思维2005 - 唐文斌:《正难则反——浅谈逆向思维在解题中的应用》穷举2004 - 鬲融:《浅谈特殊穷举思想的应用》目标转换2002 - 戴德承:《退一步海阔天空——“目标转化思想”的若干应用》2004 - 栗师:《转化目标在解题中的应用》类比2006 - 周戈林:《浅谈类比思想》分割与合并2006 - 俞鑫:《棋盘中的棋盘——浅谈棋盘的分割思想》2007 - 杨沐:《浅析信息学中的“分”与“合”》平衡思想2008 - 郑暾《平衡规划——浅析一类平衡思想的应用》。
国家集训队2009论文集信息学竞赛中概率问题
2.1 例一:LastMarble1
题目描述: 有 red 个红球,blue 个蓝球在一个袋子中。两个玩家轮流从袋子中取球,每个人每次 可以取 1,2 或 3 个球,但在他把球拿出袋子之前,他并不知道所取球的颜色。每次球被取 出袋子后,它们的颜色被公布给所有人。取走最后一个红球的人输。现在已知有人在游戏开 始前取走了 removed 个球,并且谁也不知道球的颜色。在两个玩家都采取最优策略时,先手 的胜率是多少? 约束条件: 1≤red,blue≤100 , 0≤removed≤red-1。 分析: 当 removed=0 的时候,这个问题是很普通的动态规划问题。我们只需设 F(r,b)代表现 在剩 r 个红球,b 个蓝球,面对当前局面的玩家所能得到的最大胜率。那么:
D
f ( x1 , x2 ,..., x N )dx1dx2 ...dxN ,其中等式右端表
示 N 重积分,就称 f(x1,x2,…,xN)是 N 为随机向量(X1,X2,…,XN)的联合概率密度函数。如 果有 X1,X2,…,XN 互相独立,并且分别有概率密度函数 f1(x1),f2(x2),…,fN(xN),那么
1
IOI2009 冬令营论文 梅诗珂 3.2 例四:Random Shooting ........................................... 4 总结................................................................. 感谢 ....................................................................... 参考文献.................................................................... 附录 ....................................................................... 附录 1 区域体积的表示 .................................................. 附录 2 例三方法一中区域体积公式的证明 ................................. 附录 3 论文原题 ........................................................ 12 16 16 16 16 16 17 17
国家集训队2009论文集信息学竞赛中概率问题
2 22
全文总览
样本空间 连续型随机变量 随机变量 离散型随机变量
SPOJ RNG SGU Random Shooting SRM 349 LastMarble UVA Randomness
3 22
要用到的定义
1 fi ( [x-Ri, j-Ri+1]x ) = ∫x R i R f i 1 ( t )dt [j-Ri+1,j] [j,x] i
x
P
P
f i1 (t )
f i (x)
19 22
j-Ri j-Ri+1
j j+1
t
j
j+1
x
本题总结
在解决本题的过程中,我们遇到了这样的困难: 在解决本题的过程中,我们遇到了这样的困难: N个随机变量代表着 维空间,较为抽象 个随机变量代表着N维空间 个随机变量代表着 维空间, 两个解法都从N较小的情况开始分析 较小的情况开始分析, 两个解法都从 较小的情况开始分析,发现规律
23 22
用归纳法, 用归纳法,当N=1时,V((0,+∞),x) = x显然 时 显然 符合结论. 符合结论. 设当N=2,3,…,k-1时都有结论成立,那么 时都有结论成立, 设当 时都有结论成立 N=k时,V([0,+∞), [0,+∞),…, [0,+∞),x)就是 时 就是 一个k维锥体的 维体积, 维锥体的k维体积 一个 维锥体的 维体积,椎体的底面面积 是 ( kx 1)! 同时我们知道体积就是截面面积的积分值, 同时我们知道体积就是截面面积的积分值, 而对与锥体的顶点距离为h的截面而言 的截面而言, 而对与锥体的顶点距离为 的截面而言,其 截面面积 (kx 1)! ( h ) 为,所以 所以 x x h 1 x x ( ) dh= ( 0) = V([0,+∞), [0,+∞),…, [0,+∞),x) = ∫ (k 1)! x (k 1)! k k! ■
算法合集之《组合游戏略述——浅谈SG游戏的若干拓展及变形》
中国有句古话——“智者千虑,必有一失”,而组合游戏中的游戏者 却可以做到“运筹帷幄,决胜千里”。不得不说,正是组合游戏中的“智 者”吸引着我们去探索、发觉组合游戏中的魅力!
1.2 组合游戏中状态空间向图的转化
我们可以将组合游戏中的每一个状态抽象成图中的一个点,将每一 步决策抽象成图中的一条边。我们将这个图称为该组合游戏的游戏图。
这样,对于组合游戏中的每一次对弈,我们都可以将其抽象成游戏 图中的一条从某一顶点到出度为 0 的点的路径。
组合游戏向图的转化,并不单单只是为了寻找一种对应关系,它可
1《由感性认识到理性认识——透析一类搏弈游戏的解答过程 》,张一飞,国家集训队 2002 论文 2《解析一类组合游戏》,.王晓珂,国家集训队 2007 论文
第 1 页 共 24 页
IOI2009 中国国家集训队论文
贾志豪 石家庄二中
每一个模型都有详细的证明。大多数人在学习信息学时存在的问题是 “知其然,不知其所以然”,因为大多数的比赛模式是只要求结果而不 要求过程。但这会使我们对一个事物“只知表皮,不知深髓”,如果将 一个我们知道的问题稍加变形的话,我们可能就不会了。这个问题在组 合游戏中体现得尤其突出。因此笔者对于文中的每一个定理都给出了证 明,希望读者对文中的思想“知其然,知其所以然”。
显然不是!!!
因为我们不光要考虑算法的正确性,还要考虑算法的时空开销,而 上述方法显然没有考虑算法的时空开销,上述方法的瓶颈在于没有充分 利用 SG-组合游戏问题的特殊性质。
我们先引出游戏的和的概念。
算法合集之《数学归纳法与解题之道》
结构归纳法
结构归纳法是应用在数理逻辑、计算机科学、图论和一些其他数学领域中的一种特殊 化的数学归纳法,一般用来解决非线性问题。通俗地说,如果要证明的一组基于结构的命 题之间有一个“拓扑序”(通常定义为问题的规模),那么我们往往可以从空集出发进行 归纳证明或构造。例如,树形结构上我们每次去掉根将问题规约到几个较小的子问题,图 论算法中每次处理一条边就能不断减小问题的规模……如果对于一个规模足够小的问题我 们能够解决,我们就完美的解决了原问题。 不同于一般的数学归纳法,结构归纳法的正确性依赖于“最小数原理”的推广:假设 存在反例,那一定会有最小的反例,但是运用上述论证减小其规模可得一个反例,它的规 模比最小的反例更小,这样就产生了矛盾。因此假设不成立,结构归纳法是正确的。
基本的定理、概念与方法
第一数学归纳法
P 1 True 任意给定关于自然数的命题 P n ,若 ,那么,命题对所有 * P n P n 1 n N
自然数均成立。 形象地说, 如果把整个自然数集想象成一串多米诺骨牌, P 1 True 这个要求就推倒 了其中的第一块,因此有时被形象地称之为“奠基”;我们通常称为归纳的是其中证明
IOI2009 中国国家集训队论文 数学归纳法与解题之道 张昆玮
3
关于数学归纳法
简短的回顾
数学归纳法原理的发现可以追溯到公元 1494 年意大利数学家 Francesco Maurolico 的著作 Arithmeticorum libri duo。作为皮亚诺公理系统的应用,它自诞生之日就受到广 泛关注。同时,作为应对与正整数相关的问题的一种通用而简洁的处理方法,数学归纳法 在许多算术、逻辑问题的解决中都占有核心地位。即使是一些难于解决的问题,应用数学 归纳法大多可以化简问题描述,理清其本质,为接下来的解答铺平道路。 由于其固有的递归性,构造性和美学价值,数学归纳法是中学课本与学科竞赛中的热 门话题。特别地,信息学竞赛中的算术、逻辑、拓扑、数论以及组合数学相关的问题层出 不穷,我们有理由相信,数学归纳法,以及由数学归纳法衍生的结构归纳法等构造性证明 方法在信息学的算法设计中,同样会有其用武之地。
国家集训队2009论文集浅析字母树在信息学竞
浅析字母树在信息学竞赛中的应用浙江省绍兴市第一中学董华星二〇〇八年十二月目录摘要 (3)关键字 (3)前言 (3)正文 (4)1.预备知识 (4)1.1.试题分析 (4)1.2.结构简介 (5)2.字母树在串的快速检索中的应用 (7)3.字母树在“串”排序方面的应用 (9)4.字母树在减少无效转移方面的应用 (11)5.字母树在最长公共前缀问题的应用 (13)5.1.串的最长公共前缀问题 (13)5.2.数字相关的公共前缀问题 (14)6.拓展思考 (16)6.1.字母树应用的扩展 (16)6.2.字母树的局限 (16)7.总结 (17)参考文献 (17)附录 (18)1.单词查找树 (18)2.感谢名单 (20)感谢 (21)字母树(又叫单词查找树、Trie树,Trie Tree),构造简单,并能很好地处理和“串”相关的检索(Retrieval)问题。
本文从此着手,归纳了笔者的学习经验,详细论述了其在快速查找、排序、优化转移等方面的常见应用,并对其扩展做了提示。
关键字字母树快速检索“串”排序无效转移最长公共前缀问题前言当我们走进图书馆的阅览室寻找书时,会不Array由自主地根据书架上的分类标签寻找自己所喜好的书籍;当打开电脑中的资源管理器时,我们会看到一层一层的目录结构。
它们的存在,方便了我们生活中的一个重要的问题——检索。
在信息学竞赛(Olympiad in Informatics,简称OI)的学习过程中,我们也经常会遇到关于“检索”的问题。
而通常采用的不借助任何数据结构(Data Structure)的的枚举方法,虽然简单易写,但往往存在着效率低下的弊端。
那我们如何才能图一资源管理器通过简单的途径提高算法中的检索效率?接下来笔者将浅析并推荐一种数据结构——字母树,借助它我们便能够很好地处理与“串”相关的检索问题。
1.预备知识为了更深入地让读者了解这种数据结构,本文首先将对其进行一番具体介绍并说明其构造。
国家集训队论文:浅谈信息学竞赛中的“0”和“1”
01
树状数组中 的每一个元 素的编号变 成了二制
02
编码,再通过 这些二进制编 码末尾的0的 个数来
03
决定存储什 么信息,假 设节点编号 为x,那么这
04
个节点存储 数据的区间 为2k(其中 k为x二进制
05
末尾0 的个 数)个元素 。
06
又由于每个十进制 数转化成二进制位 的话,1的个数最 多只有O(logN)个, 所以,复杂度只有 O(logN)。
2k:X and –X
具体操作:
1 插入或删除: While
2 查询: While x>0
x<=max do
do
Begin
Begin
C[x]:=c[x]+ delta;
Sum:=sum+ c[x];
X:=x+(x and –x);
X:=x-(x and –x);
End;
End;
单击添加标题
Add a title
•模型转化 Add a title
•01二叉树
例题一: Matrix
有一个M*N的矩阵,每一 个格子中的数是1或0,初 始时为0。有两种操作:
修改一个子矩阵, 将子矩阵中的数字 全部01取反。
查询第x行第y列的 格子中的数字。
01
02
如果给定的是一 个长度为N的一 排格子。
从而达到转十为二,事半功倍的效果!
欢迎提问~
Thank You!
每次询问的时候只 需计算出Sumx就可 以 求出第x个格子被修 改过几次。
查询
01 寻根溯源
02
用上面的方法看 看能否解决原来 的问题。
推而广之
怎么办呢???
国家集训队2007论文集5.杨沐《浅析信息学中
浅析信息学中的“分”与“合”福建省福州第三中学杨沐目录【摘要】..................................................................... 错误!未定义书签。
【关键字】................................................................. 错误!未定义书签。
【正文】..................................................................... 错误!未定义书签。
一、引言............................................................... 错误!未定义书签。
二、例题分析 ...................................................... 错误!未定义书签。
[例一]牛奶模版 ............................................ 错误!未定义书签。
[例二]树的重建 ............................................ 错误!未定义书签。
[例三]最优序列 ............................................ 错误!未定义书签。
三、总结............................................................... 错误!未定义书签。
【感谢】..................................................................... 错误!未定义书签。
【参考文献】............................................................. 错误!未定义书签。
国家集训队2004论文集 许智磊
证。
设 Suffix(SA[i])=u,Suffix(SA[j])=v,Suffix(SA[k])=w。
由 u=LCP(i,j)v 得 u=pv;同理 v=pw。 于是 Suffix(SA[i])=pSuffix(SA[k]),即 LCP(i,k)≥p。 (1)
不难看出,这种做法是很笨拙的,因为它没有利用到各个后缀之间的有机 联系,所以它的效率不可能很高。即使采用字符串排序中比较高效的 Multi-key Quick Sort,最坏情况的时间复杂度仍然是 O(n2)的,不能满足我们的需要。
第 2 页 共 11 页
IOI2004 国家集训队论文 许智磊
下面介绍倍增算法(Doubling Algorithm),它正是充分利用了各个后缀之间的 联系,将构造后缀数组的最坏时间复杂度成功降至 O(nlogn)。
后 缀 数 组 后 缀 数 组 SA 是 一 个 一 维 数 组 , 它 保 存 1..n 的 某 个 排 列 SA[1],SA[2],...SA[n],并且保证 Suffix(SA[i])<Suffix(SA[i+1]),1≤i<n。也就是将 S 的 n 个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入 SA 中。
出 SA2k 的复杂度就是 O(nlogn)。更聪明的方法是采用基数排序,复杂度为 O(n)。 求出 SA2k 之后就可以在 O(n)的时间内根据 SA2k 构造出 Rank2k。因此,从 SAk
和 Rankk 推出 SA2k 和 Rank2k 可以在 O(n)时间内完成。 下面只有一个问题需要解决:如何构造出 SA1 和 Rank1。这个问题非常简单:
IOI2004 国家集训队论文 许智磊
后缀数组
安徽省芜湖市第一中学 许智磊
国家集训队2009论文集浅谈几类背包题
浅谈几类背包题浙江省温州中学徐持衡指导老师:舒春平2008年12月目录摘要 (3)关键字 (3)正文 (4)一、引言 (4)二、背包的基本变换 (5)①完全背包 (5)②多次背包 (5)③单调队列优化☆ (6)三、其他几类背包问题 (8)①树形依赖背包(获取学分)☆ (8)②PKU3093☆ (11)四、总结 (12)附录 (13)参考文献 (13)文中原题 (13)摘要背包问题作为一个经典问题在动态规划中是很基础的一个部分,然而以0-1背包问题为原题,衍生转变出的各类题目,可以说是千变万化,当然解法也各有不同,如此就有了继续探究的价值。
本文就4道背包变化的题做一些探讨研究,提出本人的一些做法,希望能起到抛砖引玉的作用。
关键字动态规划背包优化正文一、引言背包问题是运筹学中的一个经典的优化难题,是一个NP-完全问题,但其有着广泛的实际应用背景,是从生活中一个常见的问题出发展开的:一个背包,和很多件物品,要在背包中放一些物品,以达到一定的目标。
在信息学中,把所有的数据都量化处理后,得到这样的一个问题:0-1 背包问题:给定n 件物品和一个背包。
物品i的价值是W i,其体积为V i,背包的容量为C。
可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。
在选择装入背包的物品时,对每件物品i ,要么装入背包,要么不装入背包。
不能将物品i 多次装入背包,也不能只装入部分物品i (分割物品i)。
因此,该问题称为0-1 背包问题。
用于求解0-1背包问题的方法主要有回溯算法、贪婪算法、遗传算法、禁忌搜索算法、模拟退火算法等。
在高中阶段,我们所谓的经典0-1背包问题,保证了所有量化后的数据均为正整数,即是一个特殊的整数规划问题,本文中如无特殊说明均以此为前提。
其经典的O(n*C)动规解法是:状态是在前i件物品中,选取若干件物品其体积总和不大于j,所能获得的最大价值为F i[j],当前的决策是第i件物品放或者不放,最终得到转移方程:F i[j] = F i-1[j] (V i>j>=0)F i[j] = max{ F i-1[j] , F i-1[j-V i]+W i } (C>=j>=V i)其中由于F i只与F i-1有关,可以用滚动数组来节省程序的空间复杂度。
国家集训队2009论文集从“k倍动态减法游戏
1.2.组合游戏需要解决的问题
由于组合游戏是一个双方博弈的游戏, 所以对于一个游戏的研究一般需要回
共 44 页-第 2 页
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题
答两个问题:谁有必胜策略?必胜策略是什么? 而在信息竞赛学的问题中需要解决的问题,也与此相对应,分三个层次: (1)判断谁有必胜策略; (2)寻找单回合的必胜选择; (3)维护多回合的必胜选择(交互题涉及) 。
1(if _(m, n) _ is _ an _ N position ) NP(m,n)= ,NP(m,n)关于 n 单调不减。 0(if _(m, n) _ is _ a _ P position )
这是因为若正整数 m0、n0 使得 NP(m0,n0)=1,则对于任意 n>n0,m=m0 都有 NP(m,n)=1。这是因为,状态(m0,n0)时玩家可以完成的操作,在状态(m,n)也允许 操作(这利用了 n>n0) ,且到达相同的状态(这利用 m=m0)。
S ( x) S ( y) 1 ,所以 S ( x) (T ( x)) 。有很多例子中, S ( x) (T ( x)) ,下文中
将会提及的“捡石子游戏”就是一个这样的例子;但是,在更多的游戏中
S ( x) (T ( x)) ,例如在本文主要讨论的“k 倍动态减法游戏”, S ( x) (T ( x) 2 ) ,
3.2.NP 状态定理:
定理: P 状态是“胜利终止状态”或者它的一切后继都为 N 状态, N 状态是“失 败终止状态”或拥有至少一个后继是 P 状态。
3.3.通式的动态规划解法
根据上面的定理,可以利用动态规划求得每个状态是 P 状态还是 N 状态。 具体的实现方法,可以按照图的拓扑逆序倒推(常用方法) ,也可以从初状态出 发进行记忆化搜索(这个留在后面讨论) 。用递推实现,我们不难设计出下面算 法: 步骤 1:把所有“胜利终止状态”标记为 P 状态,“失败终止状态”标记为 N 状 态。 步骤 2:找到所有的未定状态中,所有后继都被确定是 N 状态的状态,设置 为 P 状态。
国家集训队2004论文集_许智磊(后缀数组)
第 1 页 共 11 页
IOI2004 国家集训队论文 许智磊
基本概念
首先明确一些必要的定义: 字符集 一个字符 集Σ是 一个建立了 全序关系的集合,也就是说 ,Σ 中 的任意两个不同的元素 α 和 β 都可以比较大小,要么 α<β,要么 β<α(也就是 α>β) 。字符集Σ中的元素称为字符。 字符串 一个字符串 S 是将 n 个字符顺次排列形成的数组,n 称为 S 的 长度,表示为 len(S)。S 的第 i 个字符表示为 S[i]。 子串 字符串 S 的子串 S[i..j],i≤j,表示 S 串中从 i 到 j 这一段,也就 是顺次排列 S[i],S[i+1],...,S[j]形成的字符串。 后缀 后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。 字符串 S 的从 i 开头的后缀表示为 Suffix(S,i),也就是 Suffix(S,i)=S[i..len(S)]。 关于字符串的 大小比较,是 指通常所说 的“字 典顺序 ”比较 ,也就是对 于 两个字符串 u、v,令 i 从 1 开始顺次比较 u[i]和 v[i],如果 u[i]=v[i]则令 i 加 1, 否则若 u[i]<v[i]则认为 u<v,u[i]>v[i]则认为 u>v(也就是 v<u) ,比较结束。如 果 i>len(u) 或 者 i>len(v) 仍 比较 出 结 果 , 那么若 len(u)<len(v) 则 认为 u<v , 若 len(u)=len(v)则认为 u=v,若 len(u)>len(v)则 u>v。 从字符串的大小比较的定义来看,S 的两个开头位置不同的后缀 u 和 v 进行 比较的结果不可能是相等,因为 u=v 的必要条件 len(u)=len(v)在这里不可能满 足。 下面我们约定一个字符集Σ和一个字符串 S,设 len(S)=n,且 S[n]='$',也 就是说 S 以一个特殊字符'$'结尾,并且'$'小于Σ中的任何一个字符。除了 S[n] 之外,S 中的其他字符都属于Σ。对于约定的字符串 S,从位置 i 开头的后缀直 接写成 Suffix(i),省去参数 S。 后 缀 数 组 后 缀 数 组 SA 是 一 个 一 维 数 组 , 它 保 存 1..n 的 某 个 排 列 SA[1],SA[2],...SA[n] ,并 且 保证 Suffix(SA[i])<Suffix(SA[i+1]),1≤i<n。 也就是 将 S 的 n 个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入 SA 中。 名次数组 名次数组 Rank=SA-1,也就是说若 SA[i]=j,则 Rank[j]=i,不难 看出 Rank[i]保存的是 Suffix(i)在所有后缀中从小到大排列的“名次” 。
国家集训队2009论文集浅谈如何解决不平等博
2
IOI2009 冬令营论文 方展鹏
正文
一、引言
在信息学竞赛中,博弈问题十分常见,下面就是一个例子: 引例:Green Hackenbush(经典问题) 给出 n 棵竹子,高度分别为 a1, a2 … an,玩家 L 和 R 打算在这些竹子上面玩 砍竹子游戏,规则如下: 1、两人轮流操作,玩家 L 先手; 2、对于每次操作,先选定一棵高度不为 0 的竹子,然后砍掉该竹子的某一 段,并且将与竹子底部不相连的部分也去掉; 3、最先无法进行操作的人输。 假设玩家 L 和 R 都采取最优策略,请问对于给出的局面谁会获胜。
关键字
不平等博弈问题 Surreal Number 局面分析 递推 迭代
目录
摘要................................................................................................................................ 1 关键字............................................................................................................................ 1 目录................................................................................................................................ 1 正文................................................................................................................................ 3 一、引言................................................................................................................ 3 二、另辟蹊径........................................................................................................ 4 2.1 Surreal Number 介绍 .......................................................................... 4 2.1.1 Surreal Number 的构造 ........................................................... 4 2.1.2 Surreal Number 的一些基本定理........................................... 6 2.1.3 Surreal Number 的运算法则................................................... 6
国家集训队2009论文集浅析竞赛中一类数学期
浅析竞赛中一类数学期望问题的解决方法福建省福州第八中学汤可因摘要期望在我们生活中有着十分广泛的应用,而对于我们信息学奥赛也出现了不少求解期望值的问题。
本文对于竞赛中涉及求离散型随机变量的数学期望的题目所使用的常用方法归纳成为两大类,并进行了总结与分析。
关键字期望递推动态规划方程组目录引言 (3)预备知识 (3)一、期望的数学定义 (3)二、期望的线性性质 (3)三、全概率公式 (4)四、条件期望与全期望公式 (4)一、利用递推或动态规划解决 (4)例题一:聪聪与可可 (5)分析 (5)小结 (6)例题二:Highlander (6)分析 (6)小结 (8)例题三:RedIsGood (8)分析 (8)小结 (9)二、建立线性方程组解决 (10)引入 (10)分析 (10)需要注意的地方 (12)例题四:First Knight (12)分析 (12)例题五:Mario (15)分析 (15)总结 (16)参考文献 (17)引言数学期望亦称为期望,期望值等,在概率论和统计学中,一个离散型随机变量的期望值是试验中每次可能结果的概率乘以其结果的总和。
而期望在我们生活中有着十分广泛的应用。
例如要设计一个彩票或赌博游戏,目标为赢利,那么计算能得到的钱以及需要付出的钱的期望,它们的差则需要大于0。
又例如对于是否进行一项投资的决策,可以通过分析总结得出可能的结果并估算出其概率,得到一个期望值而决定是否进行。
期望也许与每一个结果都不相等,但是却是我们评估一个事情好坏的一种直观的表达。
正因为期望在生活中有如此之多的应用,对于我们信息学奥赛也出现了不少求解期望值的问题。
而其中大多数又均为求离散型随机变量的数学期望。
本文对于这类题目所会涉及到的常用方法进行了归纳,总结与分析。
预备知识一、期望的数学定义如果X 是一个离散的随机变量,输出值为 x 1, x 2, ..., 和输出值相应的概率为p 1, p 2, ... (概率和为1), 那么期望值 ∑=ii i x p X E )(。
国家集训队2009论文集数学归纳法与解题之道
数学归纳法与解题之道山西省实验中学张昆玮教练:唐文斌胡伟栋2008年12月16日引言我们在学习算法的时候,总会有这样那样的疑惑:如此之多的浑然天成的算法,是怎样想到的?这些算法巧诚巧矣,可它们为什么是正确的呢?其实林林总总的算法背后,无不隐藏着真正的解题之道。
解题之道博大精深,该从何谈起?上面的疑惑又该如何解决?两千五百多年前,著名的哲学家和思想家老子对道之本质参透得可谓淋漓尽致。
引文中他给我们的答案是:参悟解题之道,从数学归纳法开始。
摘要本文简述了数学归纳法的相关理论,并结合作者的解题实践,以一些经典问题与竞赛题目为例,从证明算法正确性、构造性算法、与算法优化的关系等几个方面介绍了数学归纳法在信息学竞赛中的应用,讨论了数学归纳法的实用性与适用范围,以及归纳式算法设计相关的其他一些延伸与拓展。
目录●引言 (1)●摘要 (1)●目录 (2)●关于数学归纳法 (3)简短的回顾 (3)基本的定理、概念与方法 (3)是总结更是探索 (5)●在证明算法正确性上的应用 (6)贪心算法 (6)其他算法 (7)●在构造性算法中的应用 (8)数据结构的恢复性构造 (9)策略与解决方案的构造 (12)●数学归纳法与算法优化 (14)巧妙选择归纳对象 (14)力求完善归纳基础 (16)慎重选择归纳方向 (16)适当加强归纳假设 (17)●启发作用与美学价值 (19)●问题与缺陷 (19)理论上是否欠完备 (20)应用上是否较繁琐 (20)不适用的问题 (20)●后记 (21)●题目来源 (21)关于数学归纳法简短的回顾数学归纳法原理的发现可以追溯到公元1494年意大利数学家Francesco Maurolico 的著作Arithmeticorum libri duo 。
作为皮亚诺公理系统的应用,它自诞生之日就受到广泛关注。
同时,作为应对与正整数相关的问题的一种通用而简洁的处理方法,数学归纳法在许多算术、逻辑问题的解决中都占有核心地位。
国家集训队2009论文集分治算法在树的路径问
1
IOI2009 中国国家集训队论文
长沙市雅礼中学 漆子超
【目录】
【序言】........................................................................................................................ 3 【正文】........................................................................................................................ 4 一.树的分治算法.................................................................................................... 4 基于点的分治:.............................................................................................. 4 基于边的分治:.............................................................................................. 4 效率分析:...................................................................................................... 5 【例 1】树中点对统计................................................................................... 8 算法分析................................................................................................... 8 【例 2】Free Tour 2 ...................................................................................... 10 算法分析................................................................................................. 10 【本节小结】................................................................................................ 13 二.树的路径剖分算法:................................................................................... 14 【例 3】Query On a Tree.............................................................................. 14 算法分析................................................................................................. 14 引入路径剖分......................................................................................... 14 轻重边路径剖分..................................................................................... 15 【例 4】黑白树 ........................................................................................... 17 算法分析................................................................................................. 17 【小结】........................................................................................................ 18 路径剖分与树的分治的联系:.................................................................... 19 【例 5】Query On a Tree Ⅳ ........................................................................ 20 算法分析................................................................................................. 20 【本节小结】................................................................................................ 23 三.树的分治的进一步探讨:........................................................................... 24 如何改进基于边的分治的时间复杂度........................................................ 24 使用基于边的分治解决【例 2】................................................................. 26 使用基于边的分治解决【例 5】................................................................. 27 四.全文总结....................................................................................................... 28 【参考文献】.............................................................................................................. 29 【感谢】...................................................................................................................... 29 【附录】...................................................................................................................... 29
后缀数组——处理字符串的有力工具
后缀数组 罗穗骞
例 10:长度不小于 k 的公共子串的个数(pku3415) ……………23 2.4 多个字符串的相关问题 …………………………………………………23
例 11:不小 于 k 个字符串中的最长子串(pku3294) ……………………24 例 12:每个字符串至少出现两次且不重叠的最长子串(spoj220)……24 例 13:出现或反转后出现在每个字符串中的最长子串(pku3294)……24 三、结束语 …………………………………………………………………………25 3.1 总结 ………………………………………………………………………25 3.2 参考文献 …………………………………………………………………25 3.3 致谢 ………………………………………………………………………25
1.2倍增算法
对每个字符开始的长度为 2k 的子字符串进行排序,求出排名,即 rank 值 。k 从 0 开始,每次加 1,当 2k 大于 n 以后,每个字符开始的长度为 2k 的子字符串 便相当于所有的后缀。并且这些子字符串都一定已经比较出大小,即 rank 值中 没有相同的值,那么此时的 rank 值就是最后的结果。每一次排序都利用上次长 度为 2k-1 的字符串的 rank 值,那么长度为 2k 的字符串就可以用两个长度为 2k-1 的字符串的排名作为关键字表示,然后进行基数排序,便得出了长度为 2k 的字 符串的 rank 值。以字符串“aabaaaab”为例,整个过程如图 2 所示。其中 x、y 是表示长度为 2k 的字符串的两个关键字。
例 1:最长公共前缀 ……………………………………………………17 2.2 单个字符串的相关问题 …………………………………………………17
2.2.1 重复子串 ………………………………………………………17 例 2:可重叠最长重复子串 ………………………………………17 例 3:不可重叠最长重复子串(pku1743)…………………………18 例 4:可重叠的最长重复子串(pku3261)…………………………19
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
后缀数组 罗穗骞
例 10:长度不小于 k 的公共子串的个数(pku3415) ……………23 2.4 多个字符串的相关问题 …………………………………………………23
例 11:不小于 k 个字符串中的最长子串(pku3294) ……………………24 例 12:每个字符串至少出现两次且不重叠的最长子串(spoj220)……24 例 13:出现或反转后出现在每个字符串中的最长子串(pku3294)……24 三、结束语 …………………………………………………………………………25 参考文献 ……………………………………………………………………………25 致谢 …………………………………………………………………………………25
目录
后缀数组 罗穗骞
摘要 …………………………………………………………………………………4 关键字 ………………………………………………………………………………4 正文 …………………………………………………………………………………4 一、后缀数组的实现 …………………………………………………………………4
符 串 r 的 从 第 i 个 字 符 开 始 的 后 缀 表 示 为 Suffix(i) , 也 就 是 Suffix(i)=r[i..len(r)]。
大小比较:关于字符串的大小比较,是指通常所说的“字典顺序”比较,也 就是对于两个字符串 u、v,令 i 从 1 开始顺次比较 u[i]和 v[i],如果 u[i]=v[i]则令 i 加 1,否则若 u[i]<v[i]则认为 u<v,u[i]>v[i]则认为 u>v (也就是 v<u),比较结束。如果 i>len(u)或者 i>len(v)仍比较不出结果,那 么 若 len(u)<len(v) 则 认 为 u<v , 若 len(u)=len(v) 则 认 为 u=v , 若 len(u)>len(v)则 u>v。
6
IOI2009 国家集训队论文
后缀数组 罗穗骞
具体实现: int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];} void da(int *r,int *sa,int n,int m) { int i,j,p,*x=wa,*y=wb,*t; for(i=0;i<m;i++) ws[i]=0; for(i=0;i<n;i++) ws[x[i]=r[i]]++; for(i=1;i<m;i++) ws[i]+=ws[i-1]; for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i; for(j=1,p=1;p<n;j*=2,m=p) { for(p=0,i=n-j;i<n;i++) y[p++]=i; for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j; for(i=0;i<n;i++) wv[i]=x[y[i]]; for(i=0;i<m;i++) ws[i]=0; for(i=0;i<n;i++) ws[wv[i]]++; for(i=1;i<m;i++) ws[i]+=ws[i-1]; for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; } return; }
从字符串的大小比较的定义来看,S 的两个开头位置不同的后缀 u 和 v 进 行比较的结果不可能是相等,因为 u=v 的必要条件 len(u)=len(v)在这里不可 能满足。
后缀数组:后缀数组 SA 是一个一维数组,它保存 1..n 的某个排列 SA[1], SA[2],……,SA[n],并且保证 Suffix(SA[i]) < Suffix(SA[i+1]),1≤i<n。 也就是将 S 的 n 个后缀从小到大进行排序之后把排好序的后缀的开头位置顺 次放入 SA 中。
2.2.2 子串的个数 ……………………………………………………19 例 5:不相同的子串的个数(spoj694,spoj705)………………19
2.2.3 回文子串 ………………………………………………………19 例 6:最长回文子串(ural1297)…………………………………20
2.2.4 连续重复子串 …………………………………………………20 例 7:连续重复子串(pku2406)……………………………………20 例 8:重复次数最多的连续重复子串(spoj687,pku3693)………21
1.1 基本定义 …………………………………………………………………4 1.2 倍增算法 …………………………………………………………………6 1.3 DC3 算法 …………………………………………………………………9 1.4 倍增算法与 DC3 算法的比较 ……………………………………………14 二、后缀数组的应用 ………………………………………………………………15 2.1 最长公共前缀 ……………………………………………………………15
1.2倍增算法
倍增算法的主要思路是:用倍增的方法对每个字符开始的长度为 2k 的子字 符串进行排序,求出排名,即 rank 值。k 从 0 开始,每次加 1,当 2k 大于 n 以 后,每个字符开始的长度为 2k 的子字符串便相当于所有的后缀。并且这些子字 符串都一定已经比较出大小,即 rank 值中没有相同的值,那么此时的 rank 值就 是最后的结果。每一次排序都利用上次长度为 2k-1 的字符串的 rank 值,那么长 度为 2k 的字符串就可以用两个长度为 2k-1 的字符串的排名作为关键字表示,然 后进行基数排序,便得出了长度为 2k 的字符串的 rank 值。以字符串“aabaaaab” 为例,整个过程如图 2 所示。其中 x、y 是表示长度为 2k 的字符串的两个关键字 。
名次数组:名次数组 Rank[i]保存的是 Suffix(i)在所有后缀中从小到大排 列的“名次”。
简单的说,后缀数组是“排第几的是谁?”,名次数组是“你排第几?”。容 易看出,后缀数组和名次数组为互逆运算。如图 1 所示。
5
IOI2009 国家集训队论文
后缀数组 罗穗骞
设字符串的长度为 n。为了方便比较大小,可以在字符串后面添加一个字符, 这个字符没有在前面的字符中出现过,而且比前面的字符都要小。在求出名次数 组后,可以仅用 O(1)的时间比较任意两个后缀的大小。在求出后缀数组或名次 数组中的其中一个以后,便可以用 O(n)的时间求出另外一个。任意两个后缀如 果直接比较大小,最多需要比较字符 n 次,也就是说最迟在比较第 n 个字符时一 定能分出“胜负”。
【关键字】
字符串 后缀 后缀数组 名次数组 基数排序
【正文】
一、后缀数组的实现
本节主要介绍后缀数组的两种实现方法:倍增算法和 DC3 算法,并对两种算 法进行了比较。可能有的读者会认为这两种算法难以理解,即使理解了也难以用 程序实现。本节针对这个问题,在介绍这两种算法的基础上,还给出了简洁高效 的代码。其中倍增算法只有 25 行,DC3 算法只有 40 行。
IOI2009 国家集训队论文
后缀数组 罗穗骞
信息学奥林匹克
China Nation Olympiad in Informatics
国家集训队论文
题 目: 后缀数组——处理字符串的有力工具
作 者:
罗穗骞
指导教师:
张学东
学 校:
华南师范大学附属中学
完成时间:
2009年1月
IOI2009 国家集训队论文
3
IOI2009 国家集训队论文
后缀数组 罗穗骞
后缀数组
----处理字符串的有力工具
【摘要】
后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的 替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也 并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,在信息学竞赛中 后缀数组比后缀树要更为实用。本文分两部分。第一部分介绍两种构造后缀数组 的方法,重点介绍如何用简洁高效的代码实现,并对两种算法进行了比较。第二 部分介绍后缀数组在各种类型题目中的具体应用。
例 1:最长公共前缀 ……………………………………………………17 2.2 单个字符串的相关问题 …………………………………………………17
2.2.1 重复子串 ………………………………………………………18 例 2:可重叠最长重复子串 ………………………………………18 例 3:不可重叠最长重复子串(pku1743)…………………………18 例 4:可重叠的最长重复子串(pku3261)…………………………19
待排序的字符串放在 r 数组中,从 r[0]到 r[n-1],长度为 n,且最大值小 于 m。为了函数操作的方便,约定除 r[n-1]外所有的 r[i]都大于 0, r[n-1]=0。 函数结束后,结果放在 sa 数组中,从 sa[0]到 sa[n-1]。
7
IOI2009 国家集训队论文
后缀数组 罗穗骞
1.1 基本定义
子串:字符串 S 的子串 r[i..j],i≤j,表示 r 串中从 i 到 j 这 一 段 , 也就是顺次排列 r[i],r[i+1],...,r[j]形成的字符串。