标签:bcd manacher 除了 模式 dfs 数学 快速幂 树状数组 kmp算法
//( ̄(工) ̄)您受到了比利一击,HP--,XW++,爽脆极了~
#15天信息集训前半期总结
#接下来一段用来刷长度:
#include<bits.stdc++.h>
#define C getchar()
#define ll long long
#define mmm 168430090
#define mem(a,b) memset(a,b,sizeof(a))
#pragma GCC optimize(2)
#pragma GCC optimize(1)
#pragma GCC optimize(2.5)
#ifdef __GNUG__
#pragma g++ optimize("O3");
#pragma g++ optimize("O2");
#pragma g++ optimize("O1");
#pragma g++ optimize("O1.5");
#endif
#ifdef __GNUC__
#pragma gcc optimize("O3");
#pragma gcc optimize("O2");
#pragma gcc optimize("O1");
#pragma gcc optimize("O1.5");
#endif
#ifdef __linux
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#endif
Day1:
{
day1进行了一次不算太难的考试,
在经历了一系列yy后搜索因为没设遍历顺序爆炸了,
线段树因为没用离散化,也被养死了= =
不过总的来说考得还可以..//被XWdalao吊打……
}
Day2:
{
开始讲一些奇奇怪怪的数论。。
费马小定理、解绑后的EX欧几里得……
还讲了一些快速幂、lcm、gcd……
威尔逊定理:若p为质数,则(p-1)!≡p-1 (mod p).
费马小定理:若p为质数,则a^p≡a (mod p).
欧拉定理:若gcd(a,p)=1,则a^φ(p)≡1 (mod p).
晚上dalao还讲了KMP之类的处理。
在KMP算法中,对于每一个模式串我们会事先计算出模式串的内部匹配信息,
在匹配失败时最大的移动模式串,以减少匹配次数。
}
Day3:
{
就讲了一下定理证明。。
(小学数学题?)(⊙o⊙)…表示一个都不会推
晚上dalao讲了Manacher,差点睡着。。
这个东东充分利用了回文的性质,从而达到线性时间。
首先先加一个小优化,就是在每两个字符(包括头尾)之间加没出现的字符(如%),
这样所有字符串长度就都是奇数了,方便了很多。
such as:abcde->%a%b%c%d%e%
记录p[i]表示i能向两边推(包括i)的最大距离,如果能求出p,
则答案就是max(p)-1了(以i为中点的最长回文为2*p[i]-1,
但这是加过字符后的答案,把加进去的字符干掉,最长回文就是p[i]-1)。
我们假设p[1~i-1]已经求好了,现在要求p[i]:
假设当前能达到的最右边为R,对应的中点为pos,j是i的对称点。
1.当i<R时
由于L~R是回文,所以p[i]=p[j](i的最长回文和j的最长回文相同)。
这种情况是另一种:j的最长回文跳出L了。那么i的最长回文就不一定是j的最长回文了,但蓝色的肯定还是满足的。
综上所述,p[i]=min(p[2*pos-i],R-i)。
2.当i>=R时
由于后面是未知的,于是只能暴力处理了。
}
Day4:
{
5点被拉去上海交大纽大/*高级宾馆睡觉(划掉)*/教室听讲。
}
Day5:
{
讲了枚举子集、状态压缩等等,表示题目不难(我是不是装dalao了?)
举个栗子 i=100101101(2进制)
则i的子集就是把i的一些1变成0
{
000101101/100100001/100000000/000000000
}
枚举i的子集:for (int j=i;j;j=i&(j-1))
还有位运算的小技巧等等
}
Day6:
{
讲了树的dfs序
关于子树大小、深度、结点距离等等的知识
然后是lca(最小公共祖先)的求法:
tarjan、倍增
还有用RMQ的
tarjanLCA算法要用冰茶几呢
具体实现过程:
遍历到结点i,标记flag[i]=1;
对i的邻接链表中的点j进行处理:
如果flag[j]=1;
lac<i,j>=getfather[j];
否则重复2直到处理完所有;
注意子节点j的father[j]在回溯时插入他baba
倍增求LCA的主要实现方式是用p[i][j]表示i结点,与i距离的2^j的父节点的编号;
很明显p[i][0]就是i的父节点,
具体步骤:
dfs求出每个点的父节点;
预处理出所有合法的p[i][j];
求LCA;
预处理十分jianjie,p[i][j]=p[p[i][j-1]][j-1];
自己的第2^j个父节点就是第2^(j-1)个父节点的第2^(j-1)个父节点;
因为是2的倍数,所以实现起来很好办,而且复杂度是O(nlogn)的;
下午讲了树上差分和差分
表示还蛮水的
距离公式:dis(x,y)=deep[x]+deep[y]-2*deep[lca(x,y)]
}
Day7:
{
又是数据结构。。
线段树、树状数组、左偏树。。
前两个还好(除了线段树的代码量值得吐槽)
左偏树因为没怎么听,不懂。
}
Day8:
{
打了ACM欢乐赛,成功坑到了气球5个^_^
感觉题目有点点水
但有一道大水题!!!!数据结构!!!树!!!没有看题目!!!
pugai…………= =#
晚上讲了差分约束,是一种通过条件组建不等式并建立关系式来求最长、短路得到答案的算法
在求最某路的同时还可判断条件是否可以成立
爽脆极了~~
}
标签:bcd manacher 除了 模式 dfs 数学 快速幂 树状数组 kmp算法
原文地址:https://www.cnblogs.com/handsomeybc/p/9112703.html