Codeforces 2144F Bracket Groups 题解 [ 紫 ] [ AC 自动机 ] [ DP ] [ 构造 ]

news/2025/9/18 23:43:37/文章来源:https://www.cnblogs.com/zhr0102/p/19099929

Bracket Groups:赛时猜出来用 ACAM,结果没猜到结论,我是糖比。

首先判掉一些 corner,如果出现了 \(\texttt{()}\) 为单个字符串,则一定无解。

发现后面不太好做,所以可以套路地猜一猜答案上界,发现最多只需要分成两组。具体地,考虑往极端情况构造,弄出下面两种括号串:

  • \(\texttt{((((((} \cdots\texttt{))))))}\)
  • \(\texttt{()()()} \cdots\texttt{()()()}\)

考虑证明,如果 \(s\) 不是这两个串中任意一个串的子串,则放哪一组都可以。如果 \(s\) 为第一个串的子串,那么 \(s\)一定含有两个相同且相邻的字符(一种 corner 是 \(\texttt{)(}\) 的情况,此时也会放到第一组),而这是不可能出现在第二个串中的。如果 \(s\) 为第一个串的子串则也是同理的。

剩下的只需要考虑能否被一个括号串全部包含即可。这是个经典的 ACAM 上 DP 的问题。\(dp_{i, j, k}\) 表示考虑到第 \(i\) 个字符,括号串前缀和为 \(j\),ACAM 上在节点 \(k\) 处是否可行,然后转移的时候记录一下前驱即可。最后反过来搜一遍构造出方案。

时间复杂度 \(O(nk^3)\)

#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi = pair<int, int>;
const int N = 55, V = 3005;
int n, m, ch[V][2], idx, tag[V], ne[V];
int s[N][N], slen[N];
char ts[N];
void insert(int id)
{int p = 0;for(int i = 1; i <= slen[id]; i++){if(ch[p][s[id][i]] == 0) ch[p][s[id][i]] = ++idx;p = ch[p][s[id][i]];}tag[p] = 1;
}
vector<int> g[V];
void dfs(int u)
{for(auto v : g[u]){tag[v] |= tag[u];dfs(v);}
}
void build()
{queue<int> q;for(int i = 0; i < 2; i++){if(ch[0][i]) q.push(ch[0][i]);}while(!q.empty()){int u = q.front();q.pop();for(int i = 0; i < 2; i++){int v = ch[u][i];if(v) { ne[v] = ch[ne[u]][i]; q.push(v); }else ch[u][i] = ch[ne[u]][i];}}for(int i = 1; i <= idx; i++) g[ne[i]].push_back(i);dfs(0);
}
bitset<V> dp[N][N];
tuple<int, int, int> pre[N][N][V];
char ans[N];
vector<int> ans2, ans3;
void construct(int p)
{int i = m, j = 0;while(i){tuple<int, int, int> tmp = pre[i][j][p];ans[i] = (get<1>(tmp) - j > 0 ? ')' : '(');j = get<1>(tmp);p = get<2>(tmp);i--;}cout << 1 << "\n";cout << ans + 1 << "\n";cout << n << "\n";for(int i = 1; i <= n; i++) cout << i << " ";
}
int main()
{//freopen("sample.in", "r", stdin);//freopen("sample.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; i++){cin >> ts + 1;slen[i] = strlen(ts + 1);if(slen[i] == 2 && ts[1] == '(' && ts[2] == ')'){cout << "-1";return 0;}for(int j = 1; j <= slen[i]; j++)s[i][j] = (ts[j] == '(' ? 1 : 0);insert(i);}build();dp[0][0][0] = 1;for(int i = 0; i < m; i++)for(int j = 0; j <= m; j++)for(int k = 0; k <= idx; k++){if(dp[i][j][k] == 0) continue;if(tag[ch[k][0]] == 0 && j - 1 >= 0){dp[i + 1][j - 1][ch[k][0]] = 1;pre[i + 1][j - 1][ch[k][0]] = {i, j, k};}if(tag[ch[k][1]] == 0){dp[i + 1][j + 1][ch[k][1]] = 1;pre[i + 1][j + 1][ch[k][1]] = {i, j, k};}                }for(int i = 0; i <= idx; i++){if(dp[m][0][i]){construct(i);return 0;}}cout << "2\n";for(int i = 1; i <= m; i++) {if(i & 1) cout << "(";else cout << ")";}cout << "\n";for(int i = 1; i <= n; i++){int mn = 0, mx = 0, now = 0;for(int j = 1; j <= slen[i]; j++){if(s[i][j] == 0) now--;else now++;mn = min(mn, now);mx = max(mx, now);}if(mx - mn >= 2) ans2.push_back(i);else ans3.push_back(i);}cout << ans2.size() << "\n";for(auto itm : ans2) cout << itm << " ";cout << "\n";for(int i = 1; i <= m / 2; i++) cout << "(";for(int i = 1; i <= m / 2; i++) cout << ")";cout << "\n";cout << ans3.size() << "\n";for(auto itm : ans3) cout << itm << " ";cout << "\n";    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java进制,数据类型拓展Unicode编码学习

今日学习Java 进制 int i = 10; //十进制,结果为10 int i2 = 010; //八进制,结果为8 int i3 = 0x10; //十六进制,结果为16 二进制符号为0b; float j = 0.1f; 数据类型拓展 银行业务用数据类型BigDecimal,可以进行…

【转】[IDEA] 调试时怎么判断使用哪个配置文件

【转】[IDEA] 调试时怎么判断使用哪个配置文件转自:豆包 在 IntelliJ IDEA 中调试 Spring 项目时,如果发现加载的配置文件不是预期的,通常是由于配置文件加载优先级、启动参数或项目结构问题导致的。以下是具体原因…

软件工程学习日志2025.9.18

今日重点设计了HBase后端数据插入模块,基于Java API实现了高性能的写入方案。以下为关键代码实现及技术要点: HBase数据插入工具类 支持单条插入和批量写入操作 public class HBaseInserter { private static final …

Clean Code/代码简洁性Good-Practice:使用统一异常来取代错误处理

Clean Code/代码简洁性Good-Practice:使用统一异常来取代错误处理通过自定义异常集中处理,将繁琐的参数校验代码转化为清晰、简洁且可维护的艺术。通过自定义异常集中处理,将繁琐的参数校验代码转化为清晰、简洁且可…

U3D动作游戏开发读书笔记--3.1 物理系统详解(上)

第三章 物理系统详解 3.1 物理系统的基本梳理 3.1.1 系统参数设置 了解物理配置:打开Project Settings设置Gravity:重力,常用范围是60~80 Queries Hit Backfaces :进行背面查询,如果需要查询MeshCollider背面的情…

一个联名款电子产品的技术实现和诞生

@目录项目核心亮点(“老年人”非得在地上穿梭也行,恐高嘛)核心技术(技术实现,欢迎各抒己见)市场分析基础核心创新点 项目核心亮点(“老年人”非得在地上穿梭也行,恐高嘛) 欢迎各位青少年小伙伴参与评论互动,…

US$198 Auxiliary Heater Diagnostic Unit for Eberspacher 12V/24V Systems

Auxiliary Heater Diagnostic Unit for Eberspacher 12V/24V SystemsAuxiliary Heater Diagnostic Unit Function:Read out errors from the control boxPerform diagnosis on installed heaterSwitch on heater direc…

JOISC

JOISC开坑。

20250918 之所思 - 人生如梦

20250918 之所思为了改善专注力,到网上找了不少方法,按照教程学习了冥想,但可能是境界不够,效果一直不太好,容易分心,注意力拉不回来,挺沮丧;昨天试验了番茄钟,开始一个任务,接着开始倒计时,发现注意力非常…

初赛知识点复盘

前言 作者觉得自己太菜了,就开始复盘初赛知识点了 接下来是CSP-S/J,虽然在HN很容易进复赛但是还是稳健一点 正文 1.计算机内部结构1.冯诺依曼计算机结构,分为 输入设备,存储器,输出设备,运算器,控制器,其中1.运…

WPF使用Cef加载Vue3页面问题

在WPF中使用CefSharp时遇到两个问题:1.Vue3中使用Ant Design Vue时,table不显示数据 由于之前的老项目用的Vue2框架,数据接口是一样的,页面的功能是差不多的,就把table的columns复制了过来,结果显示不出字段; 数…

curl与wget

wget 和 curl 不是替代关系,而是互补工具。wget 更“傻瓜式”,curl 更“灵活”。 但是curl 支持 40+ 协议,是 API 调试、RESTful 接口测试 的首选工具。HTTP 方法与 API 调用(curl 强项) curl 无法原生实现递归下载…

用 Go 语言与 Tesseract OCR 实现英文数字验证码识别

Go 语言本身不直接支持图像识别,但可以通过调用 Tesseract OCR 引擎来进行图像识别。我们可以使用 Go 的 tesseract 包来实现这一功能。 一、安装与配置 安装 Tesseract OCR 首先,你需要在系统中安装 Tesseract OCR。…

lc1031-两个非重叠子数组的最大和

难度:中等(中期)题目描述给定一个数组和两个长度,找到两个符合长度的不重合的连续子数组,使其和最大示例 输入:nums = [0,6,5,2,2,5,1,9,4], firstLen = 1, secondLen = 2 输出:20 解释:[6, 5] + [9]输入:num…

Segment Analytics-iOS SDK - 专业用户行为追踪解决方案

Segment Analytics-iOS SDK 是一个专业的iOS用户行为分析库,提供完整的事件追踪、用户识别、屏幕浏览统计等功能,支持多种数据集成方式,帮助开发者高效收集和分析用户行为数据。Segment Analytics-iOS SDK Analytic…

我对 WPF 动摇时的选择:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi - 行人-

我使用佳能相机,以60FPS高帧率录制视频,来比对 WPF 和 UWP 的动画流畅度,结果: WPF表现吃力和卡顿,UWP表现丝滑和高级。文章是我对.NET Framework 4.6.2框架下的动画方案的选型进行的一些探索和记录。NET Framewo…

US$1198 Xhorse VVDI2 BMW Version With Basic+BMW OBD+BMW CAS4+BMW FEM/BDC

100% Original Xhorse BMW Version With Basic+BMW OBD+BMW CAS4+BMW FEM/BDCThis VVDI2 with Activated Software List:VB-01 BMW OBDVB-02 BMW CAS4VB-03 FEM/BDC FunctionVP-01 Porsche immo data toolVJ-01 Passth…

使用 Rust 与 Tesseract OCR 识别英文数字验证码

一、安装与配置 安装 Tesseract OCR Ubuntu: 更多内容访问ttocr.com或联系1436423940 sudo apt-get update sudo apt-get install tesseract-ocr macOS: brew install tesseract Windows: 从 Tesseract 官方 GitHub…

API安全解决方案选型指南:2025年五大关键维度与厂商推荐

API安全解决方案选型指南:2025年五大关键维度与厂商推荐在数字化转型浪潮中,API已成为连接业务与数据的核心枢纽。随着API数量的爆发式增长,安全威胁也日益复杂:影子API无处不在、敏感数据暴露风险加剧、自动化攻击…