06 2013 档案

摘要:1 /* 2 CF#190DIV.1-C 3 题意:给你n个结点的树,给这些结点标记字母AB..Z,对于标记相同的结点路径上 4 的结点的标记必须有一个是大于该标记的;问是否可以标记(A是最大标记) 5 6 分析:整天思路就是找一个点,然后标记为最大标记i,然后再分别以最大标记i+1,标记该点的子树 7 依次递归;最终如果标记log(10^5) 所以必定有解;10 11 而那个点,最优的应该就是树的重心,重心的定义:去掉这个点后,树给分成a个连通分量,每个连通分量12 仍然是一棵树,并且a个连通分量中最大结点数最小;13 14 求法:这棵树的结点树为all,dfs()下去,同时记录该结点每.. 阅读全文
posted @ 2013-06-29 16:10 Rabbit_hair 阅读(347) 评论(0) 推荐(0) 编辑
摘要:求最长回文串,如果是暴力的方法的话,会枚举每个字符为中心,然后向两边检测求出最长的回文串,时间复杂度在最坏的情况下就是0(n^2),为什么时间复杂度会这么高,因为对于每一个作为中心的字符的检测是独立的,没有充分利用前面比较过信息,这就类似暴力求字符串的匹配最糟糕的情况下是0(n*m),然后通过预处理的信息把时间复杂度降低也就是kmp算法;MANACHER算法:先假设所有回文串都是以某个字符为中心的,即回文串的长度都是奇数;lc[ i ]保存的是以位置i的字符为中心的最长回文串到最右边的距离先假设以知lc[i],(0p那么直接以x为中心进行检测,并更新k;如果x=p-x+1) 那么lc[x]至少 阅读全文
posted @ 2013-06-27 18:42 Rabbit_hair 阅读(521) 评论(0) 推荐(0) 编辑
摘要:hdu4333/*题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数因为是为了练习扩展KMP所以肯定是扩展KMP,为了循环方便,在后面复制字符串,求出next[]数组后,如果next[i]>n那么肯定相等,如果小于就判断s[ next[i] ]和 s[ i+next[i] ]的大小判断trick:题目求得是形成的不同的字符串的个数,可以知道相等的字符串肯定只有一个,而从0..n-1,第二个next[i]大于n那么这个i就是该字符串的循环节;*/#include#include#include#include#include#incl 阅读全文
posted @ 2013-06-27 00:58 Rabbit_hair 阅读(856) 评论(0) 推荐(1) 编辑
摘要:在解上面这个问题前我们要先解决一个类似的问题:求字符串s的所有后缀和s本身的最长公共前缀;我们用next[]数组保存这些值;现在我们假设要求next[ x ],并且next[ i ] 0 L2 then 如下图: 表示s[0 .. L2-1] == s[x .. x+L2-1] 而且因为L2 = next[x-k]使得s[L2] != s[x+L2] 所以next[x] = L2; 证明:假设s[L2]==s[x+L2],又因为s[x+L2]==s[x-k+L2]//由1推出 所以s[L2]==s[x-k+L2] 所以next[x-k]==L2+1与next[x-k]==L2矛盾 1 void 阅读全文
posted @ 2013-06-26 21:59 Rabbit_hair 阅读(4301) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示