04 2015 档案
摘要:sa在清空方面存在一些奇怪的问题……难以ac。(留坑?)
阅读全文
摘要:连续重复子串(pku2406)给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的,求 R 的最大值。算法分析:做法比较简单,穷举字符串 S 的长度 k,然后判断是否满足。判断的时候,先看字符串 L 的长度能否被 k 整除,再看 suffix(1)和 suffix(k+1)的最...
阅读全文
摘要:注意:对整型数组求sa时,s[n]请置成-1。请离散化。可重叠的 k 次最长重复子串(pku3261)给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。算法分析:先二分答案,然后将后缀分成若干组。 不同的是,这里要判断的是有没有一个组的后缀个数不小于 k。如果有,那么存在k ...
阅读全文
摘要:spoj改版后好囧……不相同的子串的个数(spoj694,spoj705)给定一个字符串,求不相同的子串的个数。算法分析:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数。如果所有的后缀按照 suffix(sa[1]), suffix(sa[2]),suffix(sa...
阅读全文
摘要:差分消除加减一个值得影响,貌似r二分上界要设成(n-2)/2?为啥?sa求不可重叠最长重复子串给定一个字符串,求最长重复子串,这两个子串不能重叠。算法分析:这题比上一题稍复杂一点。先二分答案,把题目变成判定性问题:判断是否存在两个长度为 k 的子串是相同的,且不重叠。解决这个问题的关键还是利用hei...
阅读全文
摘要:考虑奇数长度的回文,对于字符串上的每个位置i,如果知道从i开始的后缀和到i为止的前缀反转后的字符串的lcp长度的话,也就知道了以第i个字符为对称中心的最长回文的长度了。因此,我们用在S中不会出现的字符将S和S反转后的字符串拼接起来,得到字符串S',计算S'的sa。于是,从i开始的后缀和到i为止的前缀...
阅读全文
摘要:考虑简化问题:计算一个字符串中至少出现两次的最长子串。答案一定会在sa中相邻两个后缀的lcp中。因为后缀的位置在sa中相距越远,其lcp的长度就越短,这是由于字典序的性质决定的。于是,在s1和s2中间插入字符'\0',然后等价于寻找两个后缀的lcp的最大值,且这两个后缀分属s1、s2。#includ...
阅读全文
摘要:考虑第一次切割,必然切割的是翻转后字典序最小的前缀,伪证:若切割位置更靠前:则会导致第一个数翻转后更靠前,字典序必然更大。若切割位置更靠后,则显然也会导致字典序更大。↑,sa即可对于第二次切割,有结论:将序列分割成两段再分别翻转得到的序列,可以看作是将两个原序列拼接得到的新序列中的某个字串翻转得到的...
阅读全文
摘要:模板#include#include#includeusing namespace std;#define N 100001int sa[N],t[N],t2[N],tong[N],n;char s[N];inline bool cmp(int *y,int i,int k){ return (y[...
阅读全文
摘要:预处理cost[a][b] 表示第a天到第b天用同一条线路的成本。具体转移看代码。#include#include#include#includeusing namespace std;#define N 21typedef long long ll;#define M 401int n,m,K,d...
阅读全文
摘要:http://wenku.baidu.com/view/8f1fde586edb6f1aff001f7d.html#include#include#includeusing namespace std;typedef long long ll;#define N 1001int n,m,S,T,nn...
阅读全文
摘要:Dilworth定理,将最长反链转化为最小链覆盖。//貌似还能把最长上升子序列转化为不上升子序列的个数?floyd传递闭包,将可以重叠的最小链覆盖转化成不可重叠的最小路径覆盖。(引用:这样其实就是相当于将原图改造了一下,只要 x 能到达 y ,就直接连一条边 (x, y),这样就可以“绕过”原图的一...
阅读全文
摘要:http://dzy493941464.sinaapp.com/archives/96那个SIZE貌似必须设成R*R/Q?不知为啥,自己算的不是这个的说。本机AC,线上TLE。#include#include#include#include#includeusing namespace std;in...
阅读全文
摘要:把y坐标离散化后,按x坐标排序,把询问拆成四个点,每次询问某个点左下角的点的个数,注意处理边界和重叠的情况。#include#includeusing namespace std;#define N 500001int f,C;void R(int &x){ C=0;f=1; for(;...
阅读全文
摘要:处理数组A,A[i]表示字符串a的第i个字符排序后应去的位置,队列可。对于多次出现的字符,其在a中的顺序和在b中的顺序应该是一一对应的。#include#includeusing namespace std;#define N 1000001typedef long long ll;queueqs[...
阅读全文
摘要:http://www.cnblogs.com/proverbs/archive/2012/10/29/2745281.html(↑)这样处理之后,每次询问时,对于每种颜色,从1到其倒数第二次出现的位置都会被覆盖1次,因此询问左端点的值即可。#include#includeusing namespac...
阅读全文
摘要:#includeusing namespace std;#define N 100001int n,m,a[N];bool check(int x){ int now=0,sum=1; for(int i=1;ix||sum>m) return 0; } } retur...
阅读全文
摘要:对于二分出的答案x而言,验证答案等价于将所有边权>x的边赋成1,否则赋成0,然后判断从1到n的最短路是否#include#includeusing namespace std;#define N 1001#define M 10001int n,m,K,Xs[M],Ys[M],Zs[M];int f...
阅读全文
摘要:显然最短路长度随着v的变化是单调的,于是可以二分答案,据说spfa在网格图上表现较差。#include#include#includeusing namespace std;typedef double db;typedef long long ll;#define N 101#define INF...
阅读全文
摘要:显然只有偶数长度的串符合题意,并且如果一个串符合题意,那么从其首尾各截掉一个字符也符合题意。于是枚举中心,二分可以向左右扩展的最远距离,累计答案。#include#include#includeusing namespace std;#define N 500001typedef unsigned ...
阅读全文
摘要:http://hzwer.com/1986.html#include#include#include#includeusing namespace std;#define INF 2147483647#define N 51int n,m;char a[N][N];queueq;int S,T,nn...
阅读全文
摘要:用三角形面积什么的算算点到直线的距离之类……其实相切的情况是可行的……剩下的就跟某SDOI2015一样了。#include#include#include#include#includeusing namespace std;#define N 201#define EPS 0.000001#def...
阅读全文
摘要:二分最大的边的cap,记作Lim。把所有的边的cap设为min(Lim,cap[i])。Bob一定会把单位费用加到最大边上。#include#include#include#include#includeusing namespace std;#define EPS 0.000001#define ...
阅读全文
摘要:#includeusing namespace std;#define MOD 1004535809int a[8001],f[1001][101],n,m,x,S;int main(){ scanf("%d%d%d%d",&n,&m,&x,&S); for(int i=1;i<=S;++i) ...
阅读全文
摘要:二分Time,S->炮[i]:Time*b[i]炮[i]->机器人[i]:INF机器人[i]->T:a[i]。判断是否满流。#include#include#include#includeusing namespace std;#define N 51#define EPS 0.000001#def...
阅读全文
摘要:在考试代码的基础上稍微改改就a了……当时为什么不稍微多想想……插入/删除一个新节点时就把其dfn插入set/从set中删除。当前的答案就是dfn上相邻的两两节点的距离和,再加上首尾节点的距离。比较显然?不会证明……貌似叫“虚树”?#include#includeusing namespace std...
阅读全文
摘要:#include#include#include#includeusing namespace std;#define N 100001typedef long long ll;int v[NQ[i].t;--j) { if(vis[CH[j].x]) ...
阅读全文
摘要:#include#include#include#includeusing namespace std;#define N 80001int v[N=K) { cnt-=sumv[i]; for(int j=r[i];;--j) { ...
阅读全文
摘要:#include#include#include#includeusing namespace std;int m,n;int SG[1000001];int sg(int x){ if(SG[x]!=-1) return SG[x]; if(!x) return SG[x]=0; setS; in...
阅读全文
摘要:#include#includeusing namespace std;#define MOD 1000000007typedef long long ll;ll F[16][16][16][16][16][6];ll f(int a,int b,int c,int d,int e,int pre)...
阅读全文
摘要:设siz[i]表示i的子树大小-1。询问中b在a上方的便于统计。对于b在a下方的情况,贡献为距a距离在K以内的节点的siz之和。按dfs序建立可持久化线段树,线段树的下标是深度。相当于把每个点(带权)映射到了平面上,然后求一个矩形内的点权之和。#include#includeusing namesp...
阅读全文
摘要:题解很多,实现起来以外地简洁。内层的区间线段树上用了标记永久化。#includeusing namespace std;#define N 50001struct Node{int sumv,tag,lc,rc;}T[N*256];int e;int n,m;void Update(int ql,i...
阅读全文
摘要:跑出最短路图,然后把结点拆点跑最大流。#include#include#include#include#includeusing namespace std;#define M 100001#define INF 2147483647#define N 501typedef long long ll...
阅读全文
摘要:删除了作死的建树函数。#includeusing namespace std;#define N 500001struct Node{int v,lc,rc;}T[N*21];int root[N],e;void Insert(int pre,int cur,int p,int l,int r){ ...
阅读全文
摘要:每个点的主席树的root是从其父转移来的。询问的时候用U+V-LCA-FA(LCA)即可。#include#includeusing namespace std;#define N 100001int v[N>1); T[cur].lc=++e; BuildTree(T[cur].lc,l,m); ...
阅读全文
摘要:先把序列建好,然后区间插入、单点询问等价于在左端点插入,在右端点删除,然后前缀询问。#include#include#includeusing namespace std;#define N 100001typedef long long ll;vectortong[N];typedef vecto...
阅读全文