摘要: 队友最近可能在学Splay,然后让我敲下HDU1754的题,其实是很裸的一个线段树,不过用下Splay也无妨,他说他双旋超时,单旋过了,所以我就敲来看下。但是之前写的那个Splay越发的觉得不能看,所以直接学习了大神的Splay树的写法,下面的代码是CLJ上的Splay模板,有很多值得借鉴的地方,代码量比自己写短好多,下面记录下心得。1.结点标记的add,set直接写在结点里面,更容易理解也更容易明白。2.pushDown,pushUp也写在Node里,感觉也是漂亮许多。3.第一次看到的 Node mem[maxn],*C=mem; 写法,这样就不用每次都 &mem[top++],直接 阅读全文
posted @ 2013-12-27 18:24 chanme 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 给你一个串s,如果能找到一个子串a,连接n次变成它,就把这个串称为power string,即a^n=s,求最大的n.用KMP来想,如果存在的话,那么我每次f[i]的时候退的步数应该是一样多的 譬如ababab 我每次退的一定是2步,检验一下这个串的失配指针是不是这个性质,如果是的话,那么n=strlen(s)/退的步数,否则就是直接1好了.#include#include#include#include#define maxn 1000000int f[maxn+50];char P[maxn+50];void getFail(const char *P,int *f){ int m=str 阅读全文
posted @ 2013-12-22 01:56 chanme 阅读(230) 评论(0) 推荐(0) 编辑
摘要: KMP继续练手.题目问的是一个串前缀等于后缀的可能长度是哪些,输出来.题目考的是对KMP失配指针的理解,当最后一位失配(即'\0'那里)时,指针会移动到前缀对应匹配的部分,所以这个长度是我们要的,然后接着这个新的前缀的失配指针移到的部分,与这个前缀的后缀也是匹配的..这样一直滚下去就可以了得到所有可能的值.贴一记代码.#include#include#include#include#include#include#includeusing namespace std;#define mxp 400050int f[mxp+50];char P[mxp+50];void getF 阅读全文
posted @ 2013-12-22 01:31 chanme 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 这个算法去年的这个时候就已经听过了,看毛片算法哈哈..不过理解它确实花了我很久的时间..以致于我一直很排斥字符串的学习,因为总觉得太难了,但是有些硬骨头还是要啃的,这个寒假就啃啃字符串还有一些别的东西吧,KMP的学习我看了好多好多博客才有那么些头绪,复杂度的分析更是无从谈起,不过线性匹配这样的算法实在太流弊了.~题目是水题,但也算是我的第一道KMP吧.~#include#include#include#include#include#includeusing namespace std;#define mxt 1000005#define mxp 10005#define inf 0x3f3f 阅读全文
posted @ 2013-12-22 00:55 chanme 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 学习Trie树中,所以上网搜一下Trie树的题,找到这个,人家写着是简单dp,那我就想着能学习到什么Trie树上的dp,但最后发现根本好像跟Trie树没有什么联系嘛...题意就是给你很多个字符串(长度#include#include#include#include#define maxn 10000using namespace std;struct StrNode{ char sd[25]; char s[25]; int id; bool operator sd)next[s[i]-'a']!=NULL){ p=p->next[s[i]-'a']; } 阅读全文
posted @ 2013-12-21 00:11 chanme 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 代码写了不到30分钟,改它用了几个小时。先说题意,给你一颗树,边上有权,两点间的路径上的路径的边权抑或起来就是路径的xor值,要求的是最大的这样的路径是多少。讲到树上的两点的xor,一个常用的手段就是随便选一个根,然后深搜记下每个点v到根的xor路径 w[v],那么两点x,y路径的xor就是w[x]^w[y].深搜一发,问题转化为给你一个数组a,求a中哪两个数的抑或值最大。解决该问题的方法就是Trie树。对每个权值由二进制高位到低位插到Trie树里,当要询问对于权值x最大的xor的时候,就需要从树上贪心的去匹配,譬如x的高位是1,那么我们就希望从Trie树上往0走,否则的话我们希望往1走,也就 阅读全文
posted @ 2013-12-20 00:51 chanme 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 题目很水,但毕竟是自己第一道的Trie,所以还是发一下吧.Trie的更多的应用慢慢学,AC自动机什么的也慢慢学....#include#include#include#include#include#include#define maxn using namespace std;struct TrieNode{ int cnt; int flag; TrieNode *next[26];}T[500000],*Trie;int top;void insert(char *c){ int len=strlen(c);TrieNode *p=Trie; for(int i=0;inext[c[i] 阅读全文
posted @ 2013-12-19 13:20 chanme 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 很久没打代码了,不知道为什么,昨天考岭南文化之前突然开始思考起这个问题来,这个问题据说有很多种方法,划分树什么的,不过对于我现在这种水平还是用熟悉的线段树做比较好。这到题今年8月份的时候曾经做过,那个时候是作为对函数式线段树的一个基础题来做的,那个时候不懂,看着别人的代码对拍然后摸索下来,所以到了昨天我就已经彻底忘了,因为代码不是自己写的。昨天想了很久,终于参透了它的精髓。首先对于给出的a[1]~a[n]这么多个数离散化,然后建立一个线段树,线段树中的结点对应的区间[L,R]表示的是在[L,R](离散化后的值)中有多少个数。举个例子,a={1,3,2,6,4,7} 那么假如我对这整个数组建线段 阅读全文
posted @ 2013-12-19 12:21 chanme 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 最近特别想学习下面的几个内容:1.动态凸包2.插头dp3.Trie树可惜智力有限,而且完全就没时间呀。看来只能以后补坑了。。 阅读全文
posted @ 2013-11-12 20:50 chanme 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 第一道树链剖分,学习的时候参考了下面连接博主的文章,含义深入浅出,看了之后就非常清楚树链剖分的原理了:http://blog.sina.com.cn/s/blog_7a1746820100wp67.html 个人的理解是,树链剖分实际上是在树于链的结构中找到了一种平衡,一个单纯的链在树链剖分的角度来看是一条长长的重链,在处理的时候等效于平常的区间线段树,但是当变成树路径的时候,边不具有连续性,因此很难去用线段树去维护,所以自然的,有人想出了一个办法,通过某种办法对树上的链进行编号,使得两个点的路径上的边尽可能多的连续起来,而且连续的和不连续的边加起来不超过logn条,这样我在更新线段树的时候. 阅读全文
posted @ 2013-11-09 15:23 chanme 阅读(186) 评论(0) 推荐(0) 编辑