P7915 [CSP-S 2021] 回文

题目描述

给定正整数 n n n 和整数序列 a 1 , a 2 , … , a 2 n a_1, a_2, \ldots, a_{2 n} a1,a2,,a2n,在这 2 n 2 n 2n 个数中, 1 , 2 , … , n 1, 2, \ldots, n 1,2,,n 分别各出现恰好 2 2 2 次。现在进行 2 n 2 n 2n 次操作,目标是创建一个长度同样为 2 n 2 n 2n 的序列 b 1 , b 2 , … , b 2 n b_1, b_2, \ldots, b_{2 n} b1,b2,,b2n,初始时 b b b 为空序列,每次可以进行以下两种操作之一:

  1. 将序列 a a a 的开头元素加到 b b b 的末尾,并从 a a a 中移除。
  2. 将序列 a a a 的末尾元素加到 b b b 的末尾,并从 a a a 中移除。

我们的目的是让 b b b 成为一个回文数列,即令其满足对所有 1 ≤ i ≤ n 1 \le i \le n 1in,有 b i = b 2 n + 1 − i b_i = b_{2 n + 1 - i} bi=b2n+1i。请你判断该目的是否能达成,如果可以,请输出字典序最小的操作方案,具体在【输出格式】中说明。

输入格式

每个测试点包含多组测试数据。

输入的第一行,包含一个整数 T T T,表示测试数据的组数。对于每组测试数据:

第一行,包含一个正整数 n n n
第二行,包含 2 n 2 n 2n 个用空格隔开的整数 a 1 , a 2 , … , a 2 n a_1, a_2, \ldots, a_{2 n} a1,a2,,a2n

输出格式

对每组测试数据输出一行答案。

如果无法生成出回文数列,输出一行 -1,否则输出一行一个长度为 2 n 2 n 2n 的、由字符 LR 构成的字符串(不含空格),其中 L 表示移除开头元素的操作 1,R 表示操作 2。

你需要输出所有方案对应的字符串中字典序最小的一个。

字典序的比较规则如下:长度均为 2 n 2 n 2n 的字符串 s 1 ∼ 2 n s_{1 \sim 2 n} s12n t 1 ∼ 2 n t_{1 \sim 2 n} t12n 字典序小,当且仅当存在下标 1 ≤ k ≤ 2 n 1 \le k \le 2 n 1k2n 使得对于每个 1 ≤ i < k 1 \le i < k 1i<k s i = t i s_i = t_i si=ti s k < t k s_k < t_k sk<tk

输入输出样例 #1

输入 #1

2
5
4 1 2 4 5 3 1 2 3 5
3
3 2 1 2 1 3

输出 #1

LRRLLRRRRL
-1

输入输出样例 #2

输入 #2

见附件中的 palin/palin2.in

输出 #2

见附件中的 palin/palin2.ans

说明/提示

【样例解释 #1】

在第一组数据中,生成的的 b b b 数列是 [ 4 , 5 , 3 , 1 , 2 , 2 , 1 , 3 , 5 , 4 ] [4, 5, 3, 1, 2, 2, 1, 3, 5, 4] [4,5,3,1,2,2,1,3,5,4],可以看出这是一个回文数列。

另一种可能的操作方案是 LRRLLRRRRR,但比答案方案的字典序要大。

【数据范围】

∑ n \sum n n 表示所有 T T T 组测试数据中 n n n 的和。

对所有测试点保证 1 ≤ T ≤ 100 1 \le T \le 100 1T100 1 ≤ n , ∑ n ≤ 5 × 10 5 1 \le n, \sum n \le 5 \times {10}^5 1n,n5×105

测试点编号 T ≤ T \le T n ≤ n \le n ∑ n ≤ \sum n \le n特殊性质
1 ∼ 7 1 \sim 7 17 10 10 10 10 10 10 50 50 50
8 ∼ 10 8 \sim 10 810 100 100 100 20 20 20 1000 1000 1000
11 ∼ 12 11 \sim 12 1112 100 100 100 100 100 100 1000 1000 1000
13 ∼ 15 13 \sim 15 1315 100 100 100 1000 1000 1000 25000 25000 25000
16 ∼ 17 16 \sim 17 1617 1 1 1 5 × 10 5 5 \times {10}^5 5×105 5 × 10 5 5 \times {10}^5 5×105
18 ∼ 20 18 \sim 20 1820 100 100 100 5 × 10 5 5 \times {10}^5 5×105 5 × 10 5 5 \times {10}^5 5×105
21 ∼ 25 21 \sim 25 2125 100 100 100 5 × 10 5 5 \times {10}^5 5×105 5 × 10 5 5 \times {10}^5 5×105

特殊性质:如果我们每次删除 a a a 中两个相邻且相等的数,存在一种方式将序列删空(例如 a = [ 1 , 2 , 2 , 1 ] a = [1, 2, 2, 1] a=[1,2,2,1])。

【hack 数据提供】
@潜在了H2O下面。

解题思路

  • 核心问题在于如何安排操作序列,使得 b b b 满足回文性质。关键观察如下:
  • 回文约束: b b b 的首尾必须相同,次首尾必须相同,依此类推。因此,序列 a a a 中每个数字的两次- - 出现必须被分配到 b b b 的对称位置上。
  • 操作影响:操作 L 或 R 决定了元素进入 b b b 的顺序,从而影响对称位置的配对。
  • 字典序最小:优先选择 L 操作(因为 L < R),但需保证最终能形成回文。

算法采用贪心策略:

  • 初始化配对位置:预处理序列 a a a,为每个位置 i i i 记录其配对位置 j j j(即 a i = a j a_i = a_j ai=aj i ≠ j i \neq j i=j)。
  • 尝试两种起始操作:由于字典序要求,优先尝试以 L 开头(取 a a a 的开头元素),如果失败再尝试- - 以 R 开头(取 a a a 的末尾元素)。
  • 模拟匹配过程:基于起始操作,将剩余位置划分为两个队列(左队列和右队列),然后贪心地匹配位置对:
  • 每次检查队列两端的四种可能匹配:左队首 vs 左队尾、左队首 vs 右队尾、右队首 vs 左队尾、右队首 vs 右队尾。
  • 如果匹配成功(即两位置的数字相同),记录操作并更新队列;优先选择能产生 L 操作的匹配以保持字典序最小。
  • 构建操作序列:匹配过程中记录前半部分操作(xian)和后半部分操作(ho),最终输出为 xian 顺序加上 ho 逆序。

算法正确性

  • 回文保证:匹配过程确保每个数字的两次出现被分配到对称位置,从而 b b b 满足 b i = b 2 n + 1 − i b_i = b_{2n+1-i} bi=b2n+1i
  • 字典序最小:优先尝试 L 开头,且在匹配中优先选择 L 操作(对应 xian 添加 L)。如果 L 开头可行,直接输出;否则尝试 R 开头,但需保证输出方案是所有可行方案中字典序最小的。
  • 可行性判断:如果两种起始操作均失败,则输出 -1。
  • 复杂度分析
  • 时间复杂度:每组数据时间复杂度为 O ( n ) O(n) O(n)。预处理配对位置 O ( n ) O(n) O(n),匹配过程每个元素处理一次 O ( n ) O(n) O(n)。总时间复杂度 O ( ∑ n ) O(\sum n) O(n),满足数据范围 ∑ n ≤ 5 × 1 0 5 \sum n \le 5 \times 10^5 n5×105
  • 空间复杂度: O ( n ) O(n) O(n),用于存储序列、配对位置和队列。

代码实现解析

  • 以下是基于题目所给代码的关键步骤解释(代码已优化):
  • 预处理配对:使用数组 zhiqianshu 记录数字首次出现的位置,duiyinweizhi[i] 存储位置 i i i 的配对位置。
  • 起始操作尝试:调用 solve(‘L’) 优先尝试 L 开头;若失败,再调用 solve(‘R’)。
  • 匹配模拟:
  • 根据起始操作初始化左队列(剩余位置的开头部分)和右队列(剩余位置的末尾部分)。
  • 循环检查队列两端的四种匹配:
  • 若左队首与左队尾匹配,添加两个 L 操作(记录到 xian 和 ho)。
  • 若左队首与右队尾匹配,添加 L(xian)和 R(ho)。
  • 若右队首与左队尾匹配,添加 R(xian)和 L(ho)。
  • 若右队首与右队尾匹配,添加两个 R 操作(记录到 xian 和 ho)。
  • 若无法匹配,返回失败。
  • 输出操作序列:顺序输出 xian 中的操作,逆序输出 ho 中的操作(确保整体操作序列正确)。

示例分析

  • 以样例输入 n = 5 n=5 n=5 a = [ 4 , 1 , 2 , 4 , 5 , 3 , 1 , 2 , 3 , 5 ] a = [4, 1, 2, 4, 5, 3, 1, 2, 3, 5] a=[4,1,2,4,5,3,1,2,3,5] 为例:

  • 预处理配对:位置 1 1 1 4 4 4 均为 4 4 4,位置 2 2 2 7 7 7 均为 1 1 1,依此类推。

  • 起始操作 L:取 a [ 1 ] = 4 a[1] = 4 a[1]=4,配对位置为 4 4 4。剩余位置划分为左队列 [ 2 , 3 ] [2, 3] [2,3]、右队列 [ 10 , 9 , 8 , 7 , 6 , 5 ] [10, 9, 8, 7, 6, 5] [10,9,8,7,6,5]

  • 匹配过程:

  • 左队首 2 2 2 a [ 2 ] = 1 a[2]=1 a[2]=1)与右队尾 5 5 5 a [ 5 ] = 5 a[5]=5 a[5]=5)不匹配;但左队首 2 2 2 与右队尾 7 7 7 a [ 7 ] = 1 a[7]=1 a[7]=1)匹配,添加 L(xian)和 R(ho)。

  • 更新队列后,继续匹配,最终得到 xian = [‘L’, ‘R’, ‘R’, ‘L’, ‘L’],ho = [‘R’, ‘R’, ‘R’, ‘R’, ‘L’]。

  • 输出序列:xian 顺序输出 “LRRLL”,ho 逆序输出 “RRRRL”(即 “LRRLL” + “RRRRL” = “LRRLLRRRRL”)。

  • 对于 n = 3 n=3 n=3 a = [ 3 , 2 , 1 , 2 , 1 , 3 ] a = [3, 2, 1, 2, 1, 3] a=[3,2,1,2,1,3]

  • 尝试 L 开头(取 a [ 1 ] = 3 a[1]=3 a[1]=3,配对位置 6 6 6),但剩余位置无法完成匹配。

  • 尝试 R 开头(取 a [ 6 ] = 3 a[6]=3 a[6]=3,配对位置 1 1 1),剩余位置仍无法匹配,输出 -1。

详细代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int a[N*2],zhiqianshu[N*2],duiyinweizhi[N*2],n;
bool solve(char cc)
{deque<int>zuokuohao,youkuohao;vector<int>xian,ho;xian.push_back(cc=='L'?0:6);ho.push_back(0);if (cc=='L'){for(int i=2;i<duiyinweizhi[1];i++) zuokuohao.push_back(i);for(int i=n;i>duiyinweizhi[1];i--) youkuohao.push_back(i);} else{for(int i=1;i<duiyinweizhi[n];i++) zuokuohao.push_back(i);for(int i=n-1;i>duiyinweizhi[n];i--) youkuohao.push_back(i);}while(zuokuohao.size()>0||youkuohao.size()>0){int x1=zuokuohao.size()?zuokuohao.front():0;int x2=youkuohao.size()?youkuohao.front():0;int y1=zuokuohao.size()?zuokuohao.back():0;int y2=youkuohao.size()?youkuohao.back():0;if(duiyinweizhi[x1]==y1){xian.push_back(0);ho.push_back(0);zuokuohao.pop_front();zuokuohao.pop_back();}else if(duiyinweizhi[x1]==y2){xian.push_back(0);ho.push_back(6);zuokuohao.pop_front();youkuohao.pop_back();}else if(duiyinweizhi[x2]==y1){xian.push_back(6);ho.push_back(0);youkuohao.pop_front();zuokuohao.pop_back();}else if(duiyinweizhi[x2]==y2) {xian.push_back(6);ho.push_back(6);youkuohao.pop_front();youkuohao.pop_back();} elsereturn false;}for(vector<int>::iterator it=xian.begin();it!=xian.end();it++)cout<<char('L'+*it);for(vector<int>::reverse_iterator it=ho.rbegin();it!=ho.rend();it++)cout<<char('L'+*it);cout<<'\n';return true;
}
signed main()
{	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int _;cin>>_;while (_--){cin>>n;memset(zhiqianshu,0,sizeof(zhiqianshu));n*=2;duiyinweizhi[0]=-1;for (int i=1;i<=n;i++){cin>>a[i];if(zhiqianshu[a[i]]){duiyinweizhi[zhiqianshu[a[i]]]=i;duiyinweizhi[i]=zhiqianshu[a[i]];}elsezhiqianshu[a[i]]=i;}if(!solve('L')&&!solve('R'))cout<<"-1"<<'\n';}return 0;
}

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

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

相关文章

小智AI -- ESP32-S3 DIY面包板WIFI-LCD彩屏

DIY 所需硬件 开发板&#xff1a;ESP32-S3-DevKitC-1&#xff08;选择 WROOM N16R8 模组&#xff09; Goouuu ESP32-S3-N16R8开发板数字麦克风&#xff1a;INMP441 INMP441全向麦克风模块功放&#xff1a;MAX98357A MAX98357 I2S 音频放大器模块腔体喇叭&#xff1a;8Ω 2~3W 或…

家用网络进行DNS优选

家用网络进行DNS优选的好处主要体现在以下几个方面&#xff1a; 提升网络访问速度&#xff1a; DNS优选通过选择响应时间更快的DNS服务器&#xff0c;减少域名解析的延迟&#xff0c;从而加快网页加载和应用访问速度。尤其在访问国内外网站时&#xff0c;选择合适的DNS服务器可…

刷题 | 牛客 - js中等题-下 (更ing)45/54知识点解答

JS45 数组去重 描述 为 Array 对象添加一个去除重复项的方法 示例1 输入&#xff1a; [false, true, undefined, null, NaN, 0, 1, {}, {}, a, a, NaN] 复制输出&#xff1a; [false, true, undefined, null, NaN, 0, 1, {}, {}, a] Array.prototype.uniq function () …

vue3使用krpano1.22

官方文档链接 https://krpano.com/docu/js/#top 例子 https://krpano.com/releases/1.22/viewer/examples/javascript-interface/js-api-examples.html https://krpano.com/viewsource.html?releases/1.22/viewer/examples/javascript-interface/js-api-examples.html 注…

2025年AI面试推荐榜单,数字化招聘转型优选

一、AI面试为何成为2025招聘标配&#xff1f; 2025年企业对AI面试的需求从“效率工具”升级为“战略级招聘伙伴”。数据显示&#xff0c;超7成企业计划年内全面引入AI面试&#xff0c;其中技术岗、全球化招聘及蓝领用工场景需求增速显著。以下以综合技术实力、行业口碑及落地能…

人机协作新篇章:艾利特按摩机器人如何重塑健康生活

引言&#xff1a;按摩机器人的需求爆发 在快节奏的现代生活中&#xff0c;亚健康人群比例持续攀升。据《全球健康产业白皮书》显示&#xff1a; 85%的都市人群存在肌肉劳损问题专业理疗师供需缺口达1&#xff1a;3200精准按摩服务成本年均增长18% 这一背景下&#xff0c;按摩…

从代码学习深度学习 - 情感分析:使用循环神经网络 PyTorch版

文章目录 前言1. 加载与预处理数据集数据读取与词元化构建词汇表截断、填充与数据迭代器2. 构建循环神经网络模型双向RNN模型(BiRNN)详解权重初始化3. 加载预训练词向量构建词向量加载器将预训练向量注入模型4. 训练与评估模型定义训练函数可视化训练过程5. 模型预测编写预测…

化于无形的 lambda 语法

针对数据集合的每个成员进行计算是很常见的任务&#xff0c;用循环语句当然能实现&#xff0c;但比较麻烦&#xff0c;算个简单的求和都要写很多句代码。 编程语言经常把这些运算封装成函数&#xff0c;比如 Python 的 sum 函数&#xff0c;求订单价格总和是这样写的&#xff…

day42

1. 回调函数&#xff1a;把一个函数当成“任务清单”交给另一个函数&#xff0c;等后者干完活&#xff0c;就按清单执行这个函数。比如点外卖后留电话&#xff0c;骑手送到了就打电话&#xff08;执行回调&#xff09;通知你。 2. lambda函数&#xff1a;临时写的超短函数&…

百度日志中台前端重构实践

日志中台是百度内部针对打点数据的全生命周期管理平台&#xff0c;作为公司日志数据的唯一入口&#xff0c;承担以下核心职能&#xff1a;1.功能覆盖&#xff1a;提供从数据采集、传输、存储到查询分析的一站式服务&#xff0c;支持产品运营分析、研发性能监控、运维管理等多元…

資訊安全 (Information Security)3大 “CIA“要素

資訊安全之3大要素&#xff0c;業界慣用"CIA"稱之&#xff0c;包括機密性 (Confidentiality)、完整性(Integrity)與可用性(Availability)&#xff1b;更應增加諸如鑑別性、可歸責性、不可否認性與可靠性。 1.機密性 (Confidentiality) 機密性是指採用適當的安全機制…

php后台增加权限控制

背景 最近在对接某大厂&#xff0c;部署差不多了&#xff0c;但是在漏洞扫描环节有问题&#xff0c;前端是用vue代码写的。后端是php。发现前端路由可以拦截未登录的url。但是后端php接口不用登录就能访问&#xff0c;很危险 解决方法 一、创建 Auth 中间件 首先创建一个专门…

跨平台后端编程ASP.NET CORE Razor新一代Web开发框架C#

asp.net core Razor动态语言编程代替asp.net .aspx更高级吗&#xff1f; https://blog.csdn.net/xiaoyao961/article/details/148846065 C#Blazor应用-跨平台WEB开发VB.NET-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148846437 Products.razor文件,Blazor和…

Storm-Pulse 全国强对流预报接口深度解析:从技术原理到防灾应用(附API接入示例)

2025年6月14日安徽省气象台发布的强对流黄色预警中&#xff0c;合肥、阜阳等地出现了小时雨量 30-50 毫米的短时强降水和8-10级雷暴大风&#xff0c;局地甚至观测到云闪现象。强对流天气是指由强烈上升气流引发的突发性、高破坏力天气现象&#xff0c;涵盖了短时强降水、雷暴大…

2024中国科学技术大学计算机保研上机真题

中国科学技术大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/problem 运动会比赛日程安排 题目描述 某运动会设立 M M M 个比赛项目&#xff0c;每个运动员&#xff08;共 N N N 个运动员&#xff09;可以参加多个项目&#xff0c;每个项目的比赛时长…

(LeetCode 面试经典 150 题) 122. 买卖股票的最佳时机 II (贪心)

题目&#xff1a;122. 买卖股票的最佳时机 II 思路&#xff1a;贪心&#xff0c;时间复杂度0(n)。 当天比前一天值大&#xff0c;就进行卖出的交易。购入是默认前一天已购入。 C版本&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int…

一篇文章了解XML

一、什么是 XML&#xff1f; XML 是一种结构化数据的标记语言&#xff0c;用来存储、传输和描述数据。 它和 HTML 很像&#xff0c;但它的标签是自定义的&#xff0c;不限定格式和外观&#xff0c;而是强调数据的结构和含义。 XML不是用来展示数据的&#xff0c;HTML是用来展…

react经验:i18n配置换行的富文本

应用场景 调用"useTranslations().rich"输出换行的文本。 实施步骤 1.翻译文件 例如:zh.json {"home":"第一行<br></br>第二行<font>加粗文本</font>" }2.调用rich处理标签 t.rich(home, { br: () > <br /&g…

Wpf中控件作为Binding的源

1、Xaml代码 Slider 滑动控件&#xff0c;设置了最小值0和最大值100&#xff0c;TextBox作为Binding的目标对象&#xff0c;它的Text属性作为Binding目标的属性&#xff0c;Binding的源的Source就是slider_test这个Slider滑动控件&#xff0c;Binding的源的Path就是slider_test…

【机器学习深度学习】典型的模型训练过程

目录 一、模型训练直观图 二、核心目标 三、训练过程详解 3.1 训练阶段 1、准备起点&#xff1a;输入数据 初始参数权重 2、模型尝试预测&#xff1a;变换计算 (前向传播) 3、检查错误&#xff1a;计算损失值 4、学习的关键&#xff1a;反向传播 梯度下降法 (调整权…