当前位置: 首页 > news >正文

[AGC026C] String Coloring 题解

[AGC026C] String Coloring 题解

题目分析

题目要求对长度为 \(2N\) 的字符串进行染色(红色或蓝色),使得:

  1. 正向红色序列:从左到右读取所有红色字符组成的字符串。
  2. 反向蓝色序列:从右到左读取所有蓝色字符组成的字符串。

结论:这两个序列必须完全一致。

直接暴力枚举每个字符的颜色复杂度为 \(O(2^{2N})\),当 \(N=18\) 时会达到 \(2^{36}\),显然不可行。因此我们需要使用 折半搜索 (Meet-in-the-middle)


核心算法:折半搜索

我们将字符串分成前后两部分,每部分长度均为 \(N\)

1. 逻辑推导

假设前 \(N\) 个字符生成的红色和蓝色字符串分别为 \(R_1, B_1\),后 \(N\) 个字符生成的红色和蓝色字符串分别为 \(R_2, B_2\)

根据题意,最终的红色序列为 \(R_1 + R_2\),最终的反向蓝色序列则是 \(B_2\) 的反转加上 \(B_1\) 的反转。

即:

\[R_1 + R_2 = \text{reverse}(B_2) + \text{reverse}(B_1) \]

为了方便匹配,我们拆分等式:

  • \(R_1\) 必须等于 \(\text{reverse}(B_2)\)
  • \(B_1\) 必须等于 \(\text{reverse}(R_2)\)

2. 具体步骤

  1. 处理前半段:枚举 \(2^N\) 种染色方案,计算出对应的 \((R_1, B_1)\) 二元组,并利用 std::map<pair<string, string>, long long> 记录每种二元组出现的次数。
  2. 处理后半段:枚举 \(2^N\) 种染色方案,计算出对应的 \((R_2, B_2)\)
  3. 匹配与合并:对于后半段的方案,构造查找键值 key = {reverse(B_2), reverse(R_2)},在 map 中累加对应的次数。

实现技巧:状态压缩

由于 \(N\) 较小,我们可以使用二进制状压枚举

  • 利用 (b >> i) & 1 判断第 \(i\) 位是红色(1)还是蓝色(0)。
  • 前半段直接提取,后半段提取后进行 reverse 即可匹配。

完整代码

#include <bits/stdc++.h>
using namespace std;
typedef pair <int, int> pi;
typedef pair <string, string> ps;
typedef long long ll;
#define all(x) x.begin(), x.end()
int main()
{int n;string s;cin >> n >> s;string s1 = s.substr(0, n), s2 = s.substr(n, 2 * n);map <ps, ll> mp;for (int b = 0; b < (1 << n); b++){string rd, bl;for (int i = 0; i < n; i++){if (b & (1 << i)) rd += s1[i];else bl += s1[i];}mp[{rd, bl}]++;}ll ans = 0;// mp.clear();for (int b = 0; b < (1 << n); b++){string rd, bl;for (int i = 0; i < n; i++){if (b & (1 << i)) rd += s2[i];else bl += s2[i];}// mp[{rd, bl}]++;string red = rd, blue = bl;reverse(all(red)), reverse(all(blue));auto key = make_pair(blue, red);if(mp.find(key) != mp.end()) ans += mp[key];}cout << ans;return 0;
}

复杂度分析

  • 时间复杂度\(O(2^N \cdot N)\)。主要开销在二进制枚举和字符串操作上。
  • 空间复杂度\(O(2^N \cdot N)\),用于存储 map。对于 \(N=18\),此解法在时空限制内表现优秀。
http://www.jsqmd.com/news/373824/

相关文章:

  • 计算机专业开题报告结构怎么写?结合 B/S 架构与系统设计的本科毕业设计通用框架解析
  • Windows上如何启动停止Nginx?从入门到“强制急救”全指南
  • 闲置京东e卡变现,极简实操指南 - 团团收购物卡回收
  • AI抢饭碗?2026中专财务人靠这张证反超本科生
  • AI率从96%降到5%,我用了3步搞定(附完整攻略)
  • 2026年关注:提供上门回收的塑料颗粒厂家有哪些?,市场有实力的塑料颗粒回收有哪些技术领航,品质之选 - 品牌推荐师
  • 个人信用额度高效利用:分期乐闲置额度优化方案 - 团团收购物卡回收
  • 输入服务速度与满意度,证明适度等待体验更好。
  • 2026口碑好的啤酒生产线正规供应商,按需定制服务价格如何 - 工业品网
  • 选陶瓷加工生产厂,考虑性价比和品牌该怎么选? - 工业品网
  • 3种京东e卡回收方式实测,适配多数人需求 - 团团收购物卡回收
  • 港中旅花园房产推荐哪家性价比高,中原香蜜湖三分公司上榜 - mypinpai
  • 四川比较好的高三集训价格如何 - 工业品牌热点
  • 2026年中国GEO市场格局:谁是金融、汽车与科技巨头的“AI守门人”? - 品牌观察员小捷
  • No.44 ‘基于FPGA的8点DCT变换Verilog实现及其与Matlab计算结果的对比(...
  • Python/JS项目部署工具常用命令
  • 看看山东万通技工学校汽车维修专业口碑,实力水平评价如何 - 工业推荐榜
  • 聊聊常州工作装定制制造商排名,哪家口碑比较好 - myqiye
  • 京东e卡回收别踩雷,安全变现指南 - 团团收购物卡回收
  • 宁波高山生态好茶:2026高端名优红茶企业优选推荐,生态红茶/红茶/高端红茶,高山生态高端名优红茶制造商口碑推荐榜 - 品牌推荐师
  • 2026年家用电梯厂家权威榜单 实力靠谱品牌汇总 适配别墅旧楼 安全节能选型指南 - 深度智识库
  • 2025年优质气动高温调节阀批发厂家排行榜,高性能调节阀/精小型调节阀/自力式压力调节阀/气动高温调节阀/特种调节阀调节阀厂家推荐榜单 - 品牌推荐师
  • 艾力斯特、西屋、奥佳华…2026最新盘点十大领先按摩椅品牌 - 速递信息
  • CE认证怎么联系,分享上海可靠代理机构及费用 - mypinpai
  • Apple Safari 26.3 发布 - macOS 专属浏览器 (独立安装包下载)
  • 说说全国合同纠纷律师处理案件方案有规范性的,性价比如何? - 工业设备
  • 光伏功率预测被“时间”骗了十年!峰值差半小时,真凶不是模型,是15分钟窗口对齐谁?
  • 服务不错的机械设备出口物流品牌企业哪家口碑更好 - 工业设备
  • 指标中台选型核心是计算引擎,而非静态目录
  • 2026年水冷高压膜制造企业口碑排名,代代旺包装名列前茅 - 工业品网