国家集训队2009论文集后缀数组——处理字符

合集下载

NOIP2010集训小资料

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博客)

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论文集信息学竞赛中概率问题

国家集训队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

后缀数组的应用

后缀数组的应用

二、后缀数组的应用本节主要介绍后缀数组在各种类型的字符串问题中的应用。

各题的原题请见附件二,参考代码请见附件三。

2.1最长公共前缀这里先介绍后缀数组的一些性质。

height数组:定义height[i]=suffix(sa[i-1])和suffix(sa[i])的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀。

那么对于j和k,不妨设rank[j]<rank[k],则有以下性质:suffix(j)和suffix(k)的最长公共前缀为height[rank[j]+1], height[rank[j]+2],height[rank[j]+3],…,height[rank[k]]中的最小值。

例如,字符串为“aabaaaab”,求后缀“abaaaab”和后缀“aaab”的最长公共前缀,如图4所示:那么应该如何高效的求出height值呢?如果按height[2],height[3],……,height[n]的顺序计算,最坏情况下时间复杂度为O(n2)。

这样做并没有利用字符串的性质。

定义h[i]=height[rank[i]],也就是suffix(i)和在它前一名的后缀的最长公共前缀。

h数组有以下性质:h[i]≥h[i-1]-1证明:设suffix(k)是排在suffix(i-1)前一名的后缀,则它们的最长公共前缀是h[i-1]。

那么suffix(k+1)将排在suffix(i)的前面(这里要求h[i-1]>1,如果h[i-1]≤1,原式显然成立)并且suffix(k+1)和suffix(i)的最长公共前缀是h[i-1]-1,所以suffix(i)和在它前一名的后缀的最长公共前缀至少是h[i-1]-1。

按照h[1],h[2],……,h[n]的顺序计算,并利用h数组的性质,时间复杂度可以降为O(n)。

具体实现:实现的时候其实没有必要保存h数组,只须按照h[1],h[2],……,h[n]的顺序计算即可。

国家集训队2009论文集浅析字母树在信息学竞

国家集训队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.预备知识为了更深入地让读者了解这种数据结构,本文首先将对其进行一番具体介绍并说明其构造。

国家集训队2009论文集后缀数组——处理字符

国家集训队2009论文集后缀数组——处理字符

后缀数组 罗穗骞
例 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。

BZOJ20482009国家集训队书堆数学算法

BZOJ20482009国家集训队书堆数学算法

BZOJ20482009国家集训队书堆数学算法题⽬⼤意:经典的物理上的桌边堆书问题,初中物理⽼师以前还讲过,只是仅仅记住了结论。

没关系,简单证明⼀下就好⾸先我们设由上⾄下第i本书⽐它以下那本书多伸出去的长度为a[i],前缀和为s[i],那么我们要求的就是s[n]为了简化问题我们设⼀本书的长度为1如果n=1a[1]=1/2,毫⽆疑义然后考虑两本书两本书的时候,重⼼明显在距以下那本书左端点的3/4处,故a[2]=1-3/4=1/4好的我知道了。

第⼀本是1/2,第⼆本是1/4。

那么第三本就是1/8!这样想的同学都仅仅过了例⼦。

我们考虑三本书的情况这个是怎么算的呢?⾸先先算三本书的重⼼距第三本书左端点的距离第⼀本书的重⼼为1/4 + 1/2 + 1/2第⼆本书的重⼼为1/4 + 1/2第三本书的重⼼为 1/2于是我们能够得到三本书的重⼼位置为(1/4*2+1/2+1/2*3)/3=1/2*2/3+1/2于是a[3]=1-(1/2*2/3+1/2)=1/2-1/2*2/3=1/2*(1-2/3)=1/2*1/3=1/6然后四本书的情况就不⽤多说了吧讨论四本书的重⼼距第四本书左端点的距离第⼀本书的重⼼位置为:1/6 + 1/4 + 1/2 + 1/2第⼆本书的重⼼位置为:1/6 + 1/4 + 1/2第三本书的重⼼位置为:1/6 + 1/2第四本书的重⼼位置为: 1/2于是四本书重⼼位置为(1/6*3+1/4*2+1/2+1/2*4)/4=1/2*3/4+1/2a[4]=1-(1/2*3/4+1/2)=1/2-1/2*3/4=1/2*(1-3/4)=1/2*1/4=1/8以此类推,我们有a[i]=1/2i那么这个东西怎么求和呢?n<=10^18,O(n)肯定是不现实的我们考虑调和级数极限公式lim(n->+∞)1/1+1/2+1/3+...+1/n = ln(n+1)+r当中r为欧拉常数近似值约为0.57721566490153286060651209但这是极限公式对于n⽐較⼩的情况误差会⽐較⼤所以当n⽐較⼩的时候O(n)暴⼒出解 n⽐較⼤的时候套⽤公式分界线理论上O(n)能过去即可 1000W左右就能够可是这题精度实在太低所以1W就能过去 0MS出解然后就⽔过去了。

国家集训队论文:浅谈信息学竞赛中的“0”和“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
用上面的方法看 看能否解决原来 的问题。
推而广之
怎么办呢???
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1 基本定义 …………………………………………………………………4 1.2 倍增算法 …………………………………………………………………6 1.3 DC3 算法 …………………………………………………………………9 1.4 倍增算法与 DC3 算法的比较 ……………………………………………14 二、后缀数组的应用 ………………………………………………………………15 2.1 最长公共前缀 ……………………………………………………………15
从字符串的大小比较的定义来看,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 中。
1.1 基本定义
子串:字符串 S 的子串 r[i..j],i≤j,表示 r 串中从 i 到 j 这 一 段 , 也就是顺次排列 r[i],r[i+1],...,r[j]形成的字符串。
后缀:后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字
4
IOI2009 国家集训队论文
后缀数组 罗穗骞
函数的第一步,要对长度为 1 的字符串进行排序。一般来说,在字符串的题 目中,r 的最大值不会很大,所以这里使用了基数排序。如果 r 的最大值很大, 那么把这段代码改成快速排序。代码:
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; 这里 x 数组保存的值相当于是 rank 值。下面的操作只是用 x 数组来比较字 符的大小,所以没有必要求出当前真实的 rank 值。 接下来进行若干次基数排序,在实现的时候,这里有一个小优化。基数排序 要分两次,第一次是对第二关键字排序,第二次是对第一关键字排序。对第二关 键字排序的结果实际上可以利用上一次求得的 sa 直接算出,没有必要再算一次。 代码: 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; 其中变量 j 是当前字符串的长度,数组 y 保存的是对第二关键字排序的结果 。 然后要对第一关键字进行排序,代码: 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]; 这样便求出了新的 sa 值。在求出 sa 后,下一步是计算 rank 值。这里要注 意的是,可能有多个字符串的 rank 值是相同的,所以必须比较两个字符串是否 完全相同,y 数组的值已经没有必要保存,为了节省空间,这里用 y 数组保存 rank 值。这里又有一个小优化,将 x 和 y 定义为指针类型,复制整个数组的操作可以 用交换指针的值代替,不必将数组中值一个一个的复制。代码: 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++;
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
3Leabharlann IOI2009 国家集训队论文
后缀数组 罗穗骞
后缀数组
----处理字符串的有力工具
【摘要】
后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的 替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也 并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,在信息学竞赛中 后缀数组比后缀树要更为实用。本文分两部分。第一部分介绍两种构造后缀数组 的方法,重点介绍如何用简洁高效的代码实现,并对两种算法进行了比较。第二 部分介绍后缀数组在各种类型题目中的具体应用。
后缀数组 罗穗骞
例 10:长度不小于 k 的公共子串的个数(pku3415) ……………23 2.4 多个字符串的相关问题 …………………………………………………23
例 11:不小于 k 个字符串中的最长子串(pku3294) ……………………24 例 12:每个字符串至少出现两次且不重叠的最长子串(spoj220)……24 例 13:出现或反转后出现在每个字符串中的最长子串(pku3294)……24 三、结束语 …………………………………………………………………………25 参考文献 ……………………………………………………………………………25 致谢 …………………………………………………………………………………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 重复子串 ………………………………………………………18 例 2:可重叠最长重复子串 ………………………………………18 例 3:不可重叠最长重复子串(pku1743)…………………………18 例 4:可重叠的最长重复子串(pku3261)…………………………19
名次数组:名次数组 Rank[i]保存的是 Suffix(i)在所有后缀中从小到大排 列的“名次”。
简单的说,后缀数组是“排第几的是谁?”,名次数组是“你排第几?”。容 易看出,后缀数组和名次数组为互逆运算。如图 1 所示。
5
IOI2009 国家集训队论文
后缀数组 罗穗骞
设字符串的长度为 n。为了方便比较大小,可以在字符串后面添加一个字符, 这个字符没有在前面的字符中出现过,而且比前面的字符都要小。在求出名次数 组后,可以仅用 O(1)的时间比较任意两个后缀的大小。在求出后缀数组或名次 数组中的其中一个以后,便可以用 O(n)的时间求出另外一个。任意两个后缀如 果直接比较大小,最多需要比较字符 n 次,也就是说最迟在比较第 n 个字符时一 定能分出“胜负”。
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; }
相关文档
最新文档