【HEOI 2018】制胡窜】的更多相关文章

正着做着实不太好做,正难则反,考虑反着做. 把i,j看成在切割字符串,我们统计有多少对(i,j)会切割所有与\(s_{l,r}\)相同的串.对于在后缀自动机上表示\(s_{l,r}\)的节点x,x的parent子树内的endpos节点集合,就是和\(s_{l,r}\)相等的串的最后一个字符的出现位置.我们相当于在s串里得到了若干个线段,每个线段表示的子串都和\(s_{l,r}\)相等,然后用两刀把这些串都割了.我们分最左边的串和最右边的串是否存在交集进行讨论. 如果存在交集,线段数量是m 1.第…
Loj #2479. 「九省联考 2018」制胡窜 题目描述 对于一个字符串 \(S\),我们定义 \(|S|\) 表示 \(S\) 的长度. 接着,我们定义 \(S_i\) 表示 \(S\) 中第 \(i\) 个字符,\(S_{L,R}\) 表示由 \(S\) 中从左往右数,第 \(L\) 个字符到第 \(R\) 个字符依次连接形成的字符串.特别的,如果 \(L > R\) ,或者 \(L < [1, |S|]\), 或者 \(R < [1, |S|]\) 我们可以认为 \(S_{L,…
转载请注明出处:http://www.cnblogs.com/TSHugh/p/8779709.html YJQ的题解把思路介绍得很明白,只不过有些细节说得还是太笼统了(不过正经的题解就应该这个样子吧).我的思路和YJQ有一些不同.首先: 考虑反过来,求三个串都不包含询问串的方案数,这样需要的讨论会少很多.不难发现,三个串都不包含询问串的方案,就是询问串每个出现位置里(这里的位置指的是整个串,不是右端点),都至少含有一个断点的方案数.(本段落来自YJQ题解) 然后: 可以发现割的话一定是把原来的…
后缀自动机挺好毒瘤的题. 我们考虑哪些切点是不合法的.肯定是所有的匹配串都被切了. 我们考虑第一个切口的位置. 当第一个切口在第一个出现位置前时,第二个切口必须切掉所有的串. 当第一个切口在$l_{i}$和$l_{i+1}$间的时候(此时必须保证切掉第一个串),第二个切口必须切掉$s_{i+1}$到$s_{cnt}$这些串 当第一个切口在$l_{cnt}$后时(此时依旧需要保证切掉第一个串),第二个切口随便放. 于是我们将询问离线,对于每个询问通过在parent树上倍增来找到所对应的节点. 对于…
题解 老了,国赛之前敲一个后缀树上LCT和线段树都休闲的很 现在后缀树上线段树合并差点把我写死 主要思路就是后缀树+线段树合并+容斥,我相信熟练的OIer看到这已经会了 但就是不想写 但是由于我过于老年化,我还是决定记录一下我的思路 我用后缀自动机建的后缀树,所以是反串的后缀树,我考虑的都是区间字符串的结束位置 先熟练的建一个后缀树,我们对于每个区间代表的字符串,可以在后缀树上找到对应的节点,这个节点的子树里包含的结束位置往前数\(R - L + 1\)就是所有的这个区间字符串出现的位置 我们考…
题目大意 给出一个字符串\(S\),长度为\(n\)(\(n\leq 10^5\)),\(S[l:r]\)表示\(S_l,S_{l+1}...,S_r\)这个子串.有\(m\)(\(m\leq 3\times 10^5\))次询问,每次询问给出\(l,r\),问有多少对\((i,j)\)(\(1\leq i<i+1<j\leq n\)),使与\(S[l:r]\)本质相同的子串出现在\(S[1:i]\)中或\(S[i+1:j-1]\)中或\(S[j:n]\)中. 题解 询问相当于是问有多少种方案…
这题TM是计数神题......SAM就是个板子,别脑残写错就完事了.有个技巧是快速定位子串,倍增即可. 考虑反着来,就是两个断点切割所有串,求方案数. 大概分类讨论一下......先特判掉一些情况.然后考虑最左右的两个串是否相交. 相交的情况比较友善,先特殊统计有断点在交集中.之后枚举第一个断点切割了1 ~ i个串.第二个断点就切割i+1 ~ m个串. 然后写出一个∑的式子,拆开之后发现维护right集合平方和和right集合相邻元素的乘积即可. 不相交的麻烦点(极其麻烦...)考虑枚举第一个断…
题目大意: 给一个n个节点的树,然后将其分成k+1个联通块,再在每个联通块取一条路径,将其连接起来,求连接起来的路径最大权值. 题解: 考场只会20分,还都打挂了…… 60分的做法其实并不难,nk DP即可,设$f(i,j,0/1/2)$表示i子树选取了j个联通块,i这个节点连了0/1/2条边时的最优解. 100分的做法就是60分做法的拓展. 很容易想到一件事,就是以联通块数为x轴,最优解为y轴,那么这个图像应该是一个单峰上凸函数.同时该离散函数每相邻两点间的斜率是递减的:因为考虑当前联通块数为…
转载请注明出处:http://www.cnblogs.com/TSHugh/p/8776179.html 先说60分的.思路题解上很清晰: 问题似乎等价于选K+1条点不相交的链哎!F(x,k,0/1/2)表示考虑以x为根的子树,选了k条链,点x的度数为0/1/2的最优解. 我说一下比较坑的地方吧:1.初始化要-Inf(反正我不加这个会wa)2.注意转移的顺序3.别忘了突然出现新的路径或者突然消失了一个路径的时侯加减14.一定要割k下细节说多不多,说少不少,还得自己打.说一下100分的.60分的瓶…
题意:求对抗分数差值最大. 思路:状压dp,维护一条轮廓线,最大化分差.可以发现上一行的棋子个数永远比这一行多. #include<bits/stdc++.h> using namespace std; const int INF = ~0U >> 1; int n,m; int f[(1<<25)][2]; bool vis[(1<<25)][2]; int a[20][20][2]; inline int DP(int is_visited,int no…