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的更多相关文章

  1. [CF653F] Paper task - 后缀数组,线段树,vector

    [CF653F] Paper task Description 给定一个括号序列,统计合法的本质不同子串的个数. Solution 很容易想到,只要在传统统计本质不同子串的基础上修改一下即可. 考虑经 ...

  2. CF653F Paper task

    题目链接:洛谷 首先我们不考虑本质不同这个限制. 既然不能直接用栈乱搞,我们就可以用一个前缀和的套路了. 我们将(设为1,将)设为-1,记前缀和为$s_i$,则$[i,j]$这一段是回文子串当且仅当 ...

  3. Codeforces 653F Paper task SA

    Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了. 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦. #include<bits/stdc++.h& ...

  4. 题解-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\ ...

  5. CF IndiaHacks 2016 F Paper task 后缀数组

    题目链接:http://codeforces.com/problemset/problem/653/F 大意是给出一个只包含'('和')'的括号串,求有多少不同的子串是合法的括号串 解法:对于每一个后 ...

  6. 3.26-3.31【cf补题+其他】

      计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...

  7. 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 ...

  8. 【题解】 CF11D A Simple Task

    [题解] CF11D A Simple Task 传送门 \(n \le 20\) 考虑状态压缩\(dp\). 考虑状态,\(dp(i,j,O)\)表示从\(i\)到\(j\)经过点集\(O\)的路径 ...

  9. Codeforces 959F Mahmoud and Ehab and yet another xor task 线性基 (看题解)

    Mahmoud and Ehab and yet another xor task 存在的元素的方案数都是一样的, 啊, 我好菜啊. 离线之后用线性基取check存不存在,然后计算答案. #inclu ...

  10. [CF11D]A Simple Task 题解

    题解 我们从最简单的思路开始考虑,首先看到题目发现\(n\)非常小,于是很容易想到状态压缩. 我们考虑比较直觉的状态,f[i][j][k]表示以i为起点,当前在j,之前去过的点状态为k的简单环的方案数 ...

随机推荐

  1. EF CORE 命令行

    EF 命令行 使用管理台模式 Add-Migration 添加一个新的迁移(名词),string是迁移的名称remove-Migration 删除上一次的迁移Update-Database 更新最近一 ...

  2. 在Rainbond中一键部署高可用 EMQX 集群

    本文描述如何通过云原生应用管理平台 Rainbond 一键安装高可用 EMQX 集群.这种方式适合不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kubernetes 中部署 E ...

  3. Linux C操作XML文件

    1 简介 介绍使用C语言操作xml文件. 使用的开源库:mxml mxml源码路径:michaelrsweet/mxml: Tiny XML library. (github.com) mxml官网: ...

  4. react路由过渡动画效果

    render() { return ( <div> <li><Link to="/home">Home</Link></li& ...

  5. TiDB 多集群告警监控-初章-监控融合、自动告警处理

    author:longzhuquan 背景 随着公司XC改造步伐的前进,越来越多的业务选择 TiDB,由于各个业务之间需要物理隔离,避免不了的 TiDB 集群数量越来越多.虽然每套 TiDB 集群均有 ...

  6. # android studio启动虚拟机长时间无响应,无法启动

    问题 虚拟设备长时间不响应,无法启动设备 方案 根据 android studio启动虚拟器失败 尝试删除锁文件 失败,.android 目录下不存在锁文件 电脑内存或计算配置不足 查看了模拟器需要的 ...

  7. .Net Core5.0中Autofac依赖注入整合多层,项目中可直接用

    一.配置Autofac替换内置DI 1.安装Nuget包:Autofac,Autofac.Extensions.DependencyInjection 2.Program.cs中CreateHostB ...

  8. 使用python脚本玩转古早TCAD软件(待更新)

    前言 TCAD(Technology Computer Aided Design),虽然原名中没有与半导体器件有关的词汇,但这种软件便是半导体工艺模拟及器件模拟的工具,可以说是EDA软件的一种.TCA ...

  9. nginx中多个server块共用upstream会相互影响吗

    背景 nginx中经常有这样的场景,多个server块共用一个域名. 如:upstream有2个以上的域名,nginx配置两个server块,共用一个upstream配置. 那么,如果其中一个域名发生 ...

  10. 解决Vue中使用history路由模式出现404的问题

    背景 vue中默认的路由模式是hash,会出现烦人的符号#,如http://127.0.0.1/#/. 改为history模式可以解决这个问题,但是有一个坑是:强刷新.回退等操作会出现404. Vue ...