题解 CF653F Paper task
CF653F Paper task
给定一个长度为 \(n\) 和括号串,求本质不同的合法括号串个数。\(n\le 5\times 10^5\)。
考虑如果不是求本质不同,可以想到 DP。
设 \(f_{i}\) 表示以 \(i\) 结尾的括号串数,容易发现 \(f_{i}=f_{t_{i}-1}+1\),其中 \(t_{i}\) 表示与 \(i\) 匹配的左括号位置。用栈模拟即可做到 \(O(n)\)。我们考虑把这个转移的边建出来,然后发现这是一个森林的结构。
再考虑去重,利用 SA,对于每个数的 \(f_{i}\),我们只取长度严格大于 \(height_{i}\) 的串,这对于森林中就是到根到该点路径的一段前缀,倍增优化跳的过程即可做到 \(O(n\log n)\)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=5e5+5;
char s[maxn];
ll n, m=100;
ll num[maxn], rk[maxn], sa[maxn], tp[maxn], height[maxn], g[maxn];
void basesort(){
memset(num,0,sizeof(num));
for(ll i=1;i<=n;i++) num[rk[i]]++;
for(ll i=1;i<=m;i++) num[i]+= num[i-1];
for(ll i=n;i>=1;i--) sa[num[rk[tp[i]]]--]=tp[i];
return ;
}
void SuffixSort() {
m=100s;
for(ll i=1;i<=n;i++) rk[i]=s[i]-'('+1,tp[i]=i;
basesort();
for(ll w=1,p=0;p<n;m=p,w<<=1) {
p=0;
for(ll i=1;i<=w;i++) tp[++p]=n-w+i;
for(ll i=1;i<=n;i++) if(sa[i]>w) tp[++p]=sa[i]-w;
basesort();
for(ll i=1;i<=n;++i) swap(tp[i],rk[i]);
rk[sa[1]]=1;
p=1;
for(ll i=2;i<=n;i++) {
if(tp[sa[i-1]]==tp[sa[i]]&&tp[sa[i-1]+w]==tp[sa[i]+w]) rk[sa[i]]=p;
else rk[sa[i]]=++p;
}
}
return ;
}
ll f[maxn][20];
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin>>n;
for(ll i=1;i<=n;i++) cin>>s[i];
for(ll i=1;i<=n+1;i++) {
for(ll j=0;j<20;j++) f[i][j]=n+1;
}
vector<ll> vec;
for(ll i=n;i>=1;i--) {
if(s[i]==')') vec.push_back(i);
else {
if(vec.size()&&s[vec.back()]==')') {
f[i][0]=vec.back()+1;
g[i]=g[vec.back()+1]+1;
for(ll j=1;j<20;j++) f[i][j]=f[f[i][j-1]][j-1];
vec.pop_back();
}else vec.push_back(i);
}
}
SuffixSort();
ll k=0;
for(ll i=1;i<=n;i++) {
if(k) --k;
ll j=sa[rk[i]-1];
while(i+k<=n&&s[i+k]==s[j+k]) ++k;
height[rk[i]]=k;
}
ll ans=0;
for(ll i=1;i<=n;i++) {
ll x=sa[i];
for(ll j=19;j>=0;j--) if(f[x][j]-sa[i]<=height[i]) x=f[x][j];
ans+=g[x];
}
cout<<ans<<'\n';
return 0;
}
题解 CF653F Paper task的更多相关文章
- [CF653F] Paper task - 后缀数组,线段树,vector
[CF653F] Paper task Description 给定一个括号序列,统计合法的本质不同子串的个数. Solution 很容易想到,只要在传统统计本质不同子串的基础上修改一下即可. 考虑经 ...
- CF653F Paper task
题目链接:洛谷 首先我们不考虑本质不同这个限制. 既然不能直接用栈乱搞,我们就可以用一个前缀和的套路了. 我们将(设为1,将)设为-1,记前缀和为$s_i$,则$[i,j]$这一段是回文子串当且仅当 ...
- Codeforces 653F Paper task SA
Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了. 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦. #include<bits/stdc++.h& ...
- 题解-Sakuya's task
题面 Sakuya's task \[\left(\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\right)\bmod 10^9+7 \] 数据范围:\(1\ ...
- CF IndiaHacks 2016 F Paper task 后缀数组
题目链接:http://codeforces.com/problemset/problem/653/F 大意是给出一个只包含'('和')'的括号串,求有多少不同的子串是合法的括号串 解法:对于每一个后 ...
- 3.26-3.31【cf补题+其他】
计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...
- HDU-3974 Assign the task题解报告【dfs序+线段树】
There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...
- 【题解】 CF11D A Simple Task
[题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径 ...
- Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)
Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...
- [CF11D]A Simple Task 题解
题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...
随机推荐
- LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战
LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战 0.前言 **Modelscope **是一个交互式智能体应用基于ModelScope-Agent ...
- 《iOS面试之道》-“串行队列的代码实战” 勘误
一.原书第一版154页开始讲解串行队列.并发队列.以及在Dispatch_Async.Dispatch_Sync下面的作用 最后一段代码: if(_q == NULL) { _q = dispatch ...
- RTMP推流与B帧的关系
一.H264数据结构 一个原始的H.264 NALU 由一个接一个的 NALU 组成的,而它的功能分为两层,VCL(视频编码层)和 NAL(网络提取层). VCL:包括核心压缩引擎和块,宏块和片的语法 ...
- .NET程序对接 OpenTelemetry logs
OpenTelemetry 简介 OpenTelemetry 是一个由 CNCF(Cloud Native Computing Foundation)托管的开源项目,旨在为观察性(Observabil ...
- mongodb常用数据库指令
通过客户端的命令进入到mongodb服务中 mongo命令进入客户端 show dbs 查看数据库 show tables/show collections 查看集合(查看当前库里面的表) db 查 ...
- ETL工具-nifi干货系列 第六讲 处理器JoltTransformJSON
1.处理器作用 使用Jolt转换JSON数据为其他结构的JSON,成功的路由到'success',失败的'failure'.处理JSON的实用程序不是基于流的,因此大型JSON文档转换可能会消耗大量内 ...
- knife4j/swagger救援第一现场
1.前方来报,测试环境springboot项目无法启动,现场如下: Error starting ApplicationContext. To display the auto-configurati ...
- kettle从入门到精通 第三十二课 mysql 数据连接集群/分区配置
1.这里的集群实际上是数据分区或者分片的概念,如中国全国的学生,应该不会都存在一张表里面,有可能每个省市一个表进行存储. 2.集群(分区),如下图所示 设置在"集群"标签,勾选&q ...
- C#.NET Rsa私钥加密公钥解密
在C#中,RSA私钥只能签名,不能加密,如果要加密,要借助BouncyCastle库. nuget 中引用 Portable.BouncyCastle. 工具类: RsaEncryptUtil usi ...
- 什么Java注释
定义:用于解释说明程序的文字分类: 单行注释:格式: // 注释文字多行注释:格式: /* 注释文字 */ 文档注释:格式:/** 注释文字 */ 作用:在程序中,尤其是复杂的程序中,适当地加入注释可 ...