摘要:
原题链接:http://poj.org/problem?id=2752 题目大意就是给你一个字符串,然后求出所有前缀与后缀相同的字符串长度 可以采用Hash,但是个人认为比较麻烦,于是直接上KMP 正好拿模板提练练KMP,其实只有求nxt数组的那一部分 需要注意的是有多组数据,所以需要判断EOF,而 阅读全文
摘要:
先扔结论:点(a,b)与(0,0)之间有的数量为gcd(a,b)-1(怎么证的??留给出题人) 我们求ans为所有gcd之和,但是复杂度过大,达到了O(n*m),会T 于是想到一个容斥的办法:设F[i]表示因数中有i的数对组数,然后通过容斥地减去i的所有倍数的F,来得出原本的答案 需要注意的是要开l 阅读全文
摘要:
一、算法简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现, 因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。 KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 具体实现就是实 阅读全文
摘要:
一、树链剖分的作用 通常是求树上u到v的路径节点之和 这个问题很容易可以想到设f[i]表示根节点到i节点的节点之和 t=lca(u,v),然后可以把u->v划分为u->t+t->v-t; 则有结论:u->v=f[u]+f[v]-2*f[t]+t,这样就可以求出来了 但是加上u到v的路径上的节点值的修 阅读全文
摘要:
一、LCA的定义: 在一棵树上,点u到点v之间的路径最短的那个节点就是lca(u,v) 二、倍增思想: 我们定义fa[i][j]表示节点i往上跳跃2^j次所到达的节点标号,则有结论: 1.因为2^(j-1)+2^(j-1)=2^j,所以fa[i][j]=fa[fa[i][j-1]][j-1]; 2. 阅读全文
摘要:
一、动态开点线段树 为什么要搞这样的一个鬼畜线段树? 1.区间范围过大,但是只会用到一些特定的节点,暴力开会爆内存 2.要开多棵线段树,考虑会内存爆炸,也只建需要用的节点 这个线段树的唯一区别就是需要记录下左儿子和右儿子的编号 二、主席树(可持久化线段树) First: 主席树的来源: 一个名叫主席 阅读全文
摘要:
解法一: 首先想到通过位运算的性质来做这道题,将q[i]转为二进制来做。 可以分类讨论: 1.当q[i]的第j位为1时,就说明a[l[i]]~a[r[i]]的第j位上都是1 2.反过来,当q[i]的第j位上为0时,a[l[i]]~a[r[i]]的第j位上至少有一个0 所以,先将每一个1的条件满足,然 阅读全文
摘要:
First: 调和级数是什么?用来干什么? 1.调和级数是一种结论,通过数学方法证明(自己百度。。太弱了不会) 2.调和级数目前可以用来做复杂度证明 Second: 1.调和级数公式: 这个公式可以用做复杂度证明 阅读全文
摘要:
作为一名蒟蒻,竟然学会了线段树,也是神奇。。 现在就来交流一下我对线段树的一些认识: First: 1.线段树是一种数据结构,每个节点储存一个区间的信息 2.可以用来优化DP、求区间最值等 3.递归求解,从根节点开始往下递归 4.用空间换时间 Second: 1.主要函数步骤: 这是建树函数,其中l 阅读全文
摘要:
这道题目可以使暴力枚举来解决, 但是这样就会很慢,于是加个最简单的前缀和优化,二维前缀和。 设f[i][j]为(1,1)(i , j)这个矩形中的所有目标的价值和,然后就可以快速计算出炸弹能够炸毁的价值了: 阅读全文