luogu P7915 [CSP-S 2021] 回文

news/2025/10/17 20:44:19/文章来源:https://www.cnblogs.com/lyrgo/p/19141822

题目大意

给定一个长度为 \(2n\) 的序列 \(a\),要求每次取出其第一个数或者最后一个数,使得取出的数列 \(b\) 为一个回文数列。
注:回文数列即 \(\forall i\in \{ 1,n \}\) 都有 \(b_i=b_{2n-i+1}\)

Sol

考虑第一步先取出 \(a\) 左边的那个元素,则右边同理。
如果取出左边元素,则 \(b_1=a_1\),那么 \(a\) 中与 \(a_1\) 对应的另一个元素一定最后取出,下标记为 \(p\)
可以把 \(a\) 划分成两边,即序列 \(c\) \([2,p-1]\) 和序列 \(d\) \([p+1,2n]\)
想要从其中取出元素,一定需要一个元素在这两个序列的首尾出现两次,如果有两个元素符合条件,优先选 \(c\) 中的元素(字典序最小)。
那么记当前是第 \(i\) 步,当前的操作应该存储在操作序列的 \(i\)\(2n-i+1\) 这两个位置。
(建议自己模拟一下)

接下来是分讨:

  1. \(c\) 的左右端相等,前为 L,后为 L
  2. \(c\) 的左端与 \(d\) 的左端相等,前为 L,后为 R
  3. \(c\) 的右端与 \(d\) 的右端相等,前为 R,后为 L
  4. \(d\) 的左右端相等,前为 R,后为 R
  5. 其他情况无解,请自行考虑为什么无解

Code

#include <cstdio>
#include <iostream>
#include <algorithm>using namespace std;const int N = 1e6+10;int n;
int a[N];
char res1[N] , res2[N];bool calc(char res[] , int cl , int cr , int dl , int dr) {for(int i = 2 ; i <= n/2 ; i ++) {if(cl < cr && a[cl] == a[cr]) {res[i] = 'L'; res[n-i+1] = 'L';cl ++; cr --;continue;}if(cl <= cr && dl <= dr) {if(a[cl] == a[dl]) {res[i] = 'L'; res[n-i+1] = 'R';cl ++; dl ++;continue;}if(a[cr] == a[dr]) {res[i] = 'R'; res[n-i+1] = 'L';cr --; dr --;continue;}}if(dl < dr && a[dl] == a[dr]) {res[i] = 'R'; res[n-i+1] = 'R';dl ++; dr --;continue;}return false;}return true;
}void slove() {cin >> n; n <<= 1;for(int i = 1 ; i <= n ; i ++)cin >> a[i];int p1 = 0 , p2 = 0;for(int i = 1 ; i <= n ; i ++) {if(i > 1 && a[i] == a[1]) p1 = i;if(i < n && a[i] == a[n]) p2 = i;if(p1 && p2) break;}res1[1] = 'L'; res1[n] = 'L'; res1[n+1] = '\0';res2[1] = 'R'; res2[n] = 'L'; res2[n+1] = '\0';if(calc(res1 , 2 , p1-1 , p1+1 , n)) cout << res1+1 << '\n';else if(calc(res2 , 1 , p2-1 , p2+1 , n-1)) cout << res2+1 << '\n';else cout << -1 << '\n';return;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);int T; cin >> T;while(T --) slove();return 0;
}

(比较丑陋,见谅)

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

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

相关文章

字典树 Trie 乱讲

Trie 是什么 实际上它就是一颗像字典的树,支持插入单词和查询单词个数等操作。 它的边权是某个字符。比如上图,插入单词 aca 时,我们就可以在 \(5\) 号节点下新建一个节点,边权为 a。而查询是否单词 abs 时,答案为…

系统稳定性监控

系统监控告警在研发日常运营中扮演着关键角色。没有监控,线上应用的运行就如同一个黑盒,无法预知潜在问题,往往只能依靠客服或用户反馈来发现。但此时,可能已经错过了最佳解决时机,甚至导致用户流失。一:系统监控…

USACO 绿-蓝 思维题小记

P6005 [USACO20JAN] Time is Mooney G dj 跑最长路是错的,可以以经过边数为阶段 \(O(nm)\) dp P6149 [USACO20FEB] Triangles S 枚举每个点,四个象限分讨,前缀和+二分做完 P6278 [USACO20OPEN] Haircut G 我的想法是…

Day16-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\classlei

Random()java.lang.Math.Random 调用这个Math.Random()能返回带正号的double值,该值[0.0,1.0),该返回值是一个伪随机选择的数,在该范围内近似均匀分布 public class random {public static void main(String[] args…

一个实用的短视频脚本创作指令分享

整理了一套结构化的AI指令,专门用来生成抖音短视频脚本。实测下来效果不错,这里分享给有需要的朋友。上周帮朋友优化了几个短视频脚本,发现很多人卡在"知道要拍什么,但不知道怎么拍"这个环节。于是整理了…

redis和mysql之间的数据一致性

解决双写一致性问题的主要策略 1、旁路缓存模式(Cache Aside Pattern) 在这个模式中,我们一般都是先更新数据库再删除旧缓存。 首先,为什么我们不选择先删除缓存再更新数据库,因为这样会导致在并发的情况下,假如A线…

ubuntu允许root登录桌面系统

1.设置root密码 sudo passwd root2.解锁root sudo passwd -u root 3.允许root登录 sudo nano /etc/gdm3/custom.conf# [Security] 下添加一下行AllowRoot=truesudo nano /etc/pam.d/gdm-password#注释或删掉以下行au…

申威(sw_64)架构下如何安装java-1.8.0-swjdk的rpm包?​

申威(sw_64)架构下如何安装java-1.8.0-swjdk的rpm包?​​ 专门为申威(sw_64)架构的电脑打造的Java 8运行环境。 ​1. 下载文件​ 安装包下载:https://pan.quark.cn/s/936281541bdf ,确保你已经下载了 java-1.8.…

AI协科学家:技术革命还是安全噩梦?

本期节目深入探讨AI协科学家如何推动科学突破,分析基于智能体架构中的安全黑洞问题,讨论人类是否准备好让AI处理所有日常任务,并揭示相关技术风险与挑战。在《两个漏洞之间》的这期特别节目中,我们紧接着上个月的内…

一个决定

一个决定在家毛了好几天了,一个原因是下雨,一个原因是家里有大显示器。 但是家里的效率奇差。 自己做饭,一日三餐得刷碗,然后吃饭得时候刷剧,吃完饭了,还很难抽离出来。 今天好了,炒白菜得时候加了两勺我妈今年…

详细介绍:k8s部署前后分离架构微服务——跨域和缓存问题

详细介绍:k8s部署前后分离架构微服务——跨域和缓存问题pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

npm镜像配置

npm全称Node Package Manager,是node.js的模块依赖管理工具。由于npm的源在国外,所以国内用户使用起来各种不方便。下面整理出了一部分国内优秀的npm镜像资源,国内用户可以选择使用。 国内优秀npm镜像淘宝npm镜像搜…

一些特性

原始字符串(Raw String Literals) C++ 11特性 一种所见即所得的东西,可以完美返回你想要的字符串,包括换行等等 大体长这样 R"()"使用方式如 string k = R"(asdfasd sd gf a)"; cout <<…

实用指南:计算机毕设java基于mybatis的医用器械管理系统 基于 SSM+JavaWeb 的医用器械全流程管理平台 Java+MySQL 的医疗物资一体化系统

实用指南:计算机毕设java基于mybatis的医用器械管理系统 基于 SSM+JavaWeb 的医用器械全流程管理平台 Java+MySQL 的医疗物资一体化系统2025-10-17 20:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: …

计算机视觉技术与应用深度解析

本文详细介绍了计算机视觉技术在电商推荐、无人机导航、广告生成等领域的实际应用,探讨了视觉语言模型的架构设计与抗幻觉技术,并分析了云端AI服务的三层技术栈构建原理。计算机视觉技术与应用深度解析 在今年的计算…

央链知播受权发布:图说《“可信资产 IPO + 数链金融 RWA” 链改 2.0 六方共识》 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AGC 板刷记录1

准备板刷 \(\text{agc}\),顺便写一个做题记录 [AGC072A] Rhythm Game 感觉水黑吧,洛谷恶评。 一眼就能看出不是贪心就是 \(\text{dp}\),发现其实两者兼有,首先把这个题转化成:有若干个任务,第 \(i\) 个任务在 \(…

2025.10.17总结

心理咨询完成聊天室功能,有点小bug,但是整体上功能已经较为完善了,修修改改后去进行心理视频学习,或心理测评模块的开发

记Windows 11环境Rust下载安装配置流程

记Windows 11环境Rust下载安装配置流程 一、Rustup下载按我的理解,这个工具类似于Steam,Rust则是你要安装的游戏,你可以在这个下载器命令行界面进行对Rust的镜像源、安装位置配置。在Rust官网链接下载Rustup下载器。…

K8s学习笔记(九) job与cronjob - 教程

K8s学习笔记(九) job与cronjob - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…