题解 CF653F Paper task】的更多相关文章

[CF653F] Paper task Description 给定一个括号序列,统计合法的本质不同子串的个数. Solution 很容易想到,只要在传统统计本质不同子串的基础上修改一下即可. 考虑经典统计过程,对于第 \(i\) 个后缀,它的贡献为 \(n - sa[i] + 1 - h[i]\) 也就意味着,它产生贡献的区间是 \([sa[i]+h[i], n]\) .换言之,对任意 \(j \in [sa[i]+h[i], n]\) , \(s[sa[i],j]\) 是一个答案. 那么我们…
题目链接:洛谷 首先我们不考虑本质不同这个限制. 既然不能直接用栈乱搞,我们就可以用一个前缀和的套路了. 我们将(设为1,将)设为-1,记前缀和为$s_i$,则$[i,j]$这一段是回文子串当且仅当 1.$s_j=s_{i-1}$ 2.$\forall k\in [i,j],s_k\geq s_{i-1}$ 于是我们枚举$i$,显然$j$要满足第二个性质就肯定不能超过一个上界,这个上界是可以二分的.每次check的时候就判断一下区间最小值,可以用ST表维护. 然后看看本质不同如何做. 这时候我们…
Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了. 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII…
题面 Sakuya's task \[\left(\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\right)\bmod 10^9+7 \] 数据范围:\(1\le n\le 10^{10}\). 蒟蒻语 考场爆零真开森. 本来以为要卷 \(1*1\),没想到真要卷 \(1*1\),只不过要一个一个卷-- 考场上还以为要洲阁 \(\tt Min\_25\). 正解 先莫反操作一发: \[\begin{split} &\sum_{i=1}^n\sum_{j=…
题目链接:http://codeforces.com/problemset/problem/653/F 大意是给出一个只包含'('和')'的括号串,求有多少不同的子串是合法的括号串 解法:对于每一个后缀,需要能够求出这个后缀有多少前缀是合法的括号串,这个可以用O(log n)复杂度的二分来解决.注意,二分的范围并不是整个后缀,因为如果将'('视作+1, ')'视作-1,则一个合法的括号串必须时刻不能小于0.所以可以在ST表上二分出合法范围,在这个范围内去统计有多少合法串(即'('与')'正负相消…
  计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), sizeof((a))) using namespace std; int n, m, t; int main() { int i, j, x; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m)…
There is a company that has N employees(numbered from 1 to N),every employee in the company has a immediate boss (except for the leader of whole company).If you are the immediate boss of someone,that person is your subordinate, and all his subordinat…
[题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径有多少. \(dp(i,j,O \bigcup i)=\Sigma dp(i,p,O)\),\(j-p\)有一条边. 考虑内存,我们可以认定状态压缩串中\(lowbit(x)\)位是一条路的起点,这样我们直接省掉一维.空间限制卡进去了. 考虑答案怎么统计,就是\((\Sigma (dp(i,j,O)…
Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_pair…
题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数. 仔细思考以后,我们发现这个状态有问题,问题在于,每一个环再环内的每个点都被计算了一次. 那么怎么避免这种状态呢?我们考虑让每个环仅由其中编号最小的点贡献. 这样操作了以后,每个环仍然被计算了两遍(顺时针一次,逆时针一次),但是关系不大,最后统计答案的时候除2即可. 考虑到起点已经是环中最小的点了…