首页 > 其他分享 >CSPS2021回文

CSPS2021回文

时间:2022-09-20 13:22:30浏览次数:62  
标签:CSPS2021 10 le 样例 times 100 sim 回文

[CSP-S 2021] 回文

题目描述

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

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

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

输入格式

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

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

第一行,包含一个正整数 \(n\)。
第二行,包含 \(2 n\) 个用空格隔开的整数 \(a_1, a_2, \ldots, a_{2 n}\)。

输出格式

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

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

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

字典序的比较规则如下:长度均为 \(2 n\) 的字符串 \(s_{1 \sim 2 n}\) 比 \(t_{1 \sim 2 n}\) 字典序小,当且仅当存在下标 \(1 \le k \le 2 n\) 使得对于每个 \(1 \le i < k\) 有 \(s_i = t_i\) 且 \(s_k < t_k\)。

样例 #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\) 数列是 \([4, 5, 3, 1, 2, 2, 1, 3, 5, 4]\),可以看出这是一个回文数列。

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

【数据范围】

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

对所有测试点保证 \(1 \le T \le 100\),\(1 \le n, \sum n \le 5 \times {10}^5\)。

测试点编号 \(T \le\) \(n \le\) \(\sum n \le\) 特殊性质
\(1 \sim 7\) \(10\) \(10\) \(50\)
\(8 \sim 10\) \(100\) \(20\) \(1000\)
\(11 \sim 12\) \(100\) \(100\) \(1000\)
\(13 \sim 15\) \(100\) \(1000\) \(25000\)
\(16 \sim 17\) \(1\) \(5 \times {10}^5\) \(5 \times {10}^5\)
\(18 \sim 20\) \(100\) \(5 \times {10}^5\) \(5 \times {10}^5\)
\(21 \sim 25\) \(100\) \(5 \times {10}^5\) \(5 \times {10}^5\)

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

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

解答

这道题是一个很好的思维题。我看出两个性质:

  1. 第一个必然是L
  2. 最后一个必然是L

不会了,但猜到了是栈,没想到用两个栈

看过题解后:

  1. 为什么要用两个栈,我们可以想到可以第一个数和数列中与之相同的数的位置作为两个断点。

img

借犇犇一个图

  1. 根据题目的意思,我们可以删数列的左边,也可以删右边。因为一开始两个断点一个是第一个放进去的,另个一个是最后一个放进去的,已经固定了。那么我们要做的就是先删里面的,再删外面的,所以对应的两个栈分别是由上到下和由下到上。

  2. 我们可以发现两个栈空的时候出答案

  3. 什么时候可以删数呢?回归题目,第一个数列可以从左往右删,因为第二个断点已经把右边锁死了,第二个数列可以从右往左删,对应的就是1的栈顶,2的栈底。我们还可以发现,假如两个相同的数分别存在于一个栈的栈顶和栈底,也是可以删的。

  4. 删数时如何保存答案?可以看图,然后你要发现,一个L对应一个R,R还是对应R,因为如果你在答案前半行有R的话,说明那属于4中第二种情况,对应的也是R,L就不说了

代码

标签:CSPS2021,10,le,样例,times,100,sim,回文
From: https://www.cnblogs.com/zychh/p/16710713.html

相关文章

  • 算法学习—————PAM回文自动机
    时隔一年,第一次学习新的算法原理和AC自动机差不多基本思想:两棵树分别代表奇偶在一个回文串两边同时填上相同字符可以得到另一个回文串,以此构建两棵树树上维护信......
  • leetcode 6356 最长回文子串长度,最长回文子串 C/C++ 动态规划方案 同样的用例,测试执
    对dp变量需要执行初始化,否者LeetCode会出现同样的用例,单独执行可以通过,提交代码执行不通过的情况。 下面是找最长回文串的动态规划代码。class Solution {public:......
  • LeetCode 131 分割回文串
    classSolution{public:vector<vector<string>>res;vector<string>path;boolis(strings,intstart,intend){for(inti=start,j=......
  • 信息学一本通 1309:【例1.6】回文数(Noip1999)
    时间限制:1000ms      内存限制:65536KB提交数:17647   通过数:7270【题目描述】若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其......
  • letcode算法--7.回文数
    给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。来源:力扣(Leet......
  • 数字分离及回文数
    1.统计n的位数intcont(intn)//统计n的位数{ints=0;while(n>0){s++;n/=10;}returns;}2.统计n的数字和intsum(in......
  • leetcode 409 Longest Palindrome 最长回文串(简单)
    一、题目大意给定一个包含大写字母和小写字母的字符串s,返回通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符......
  • C20220725T3 回文
    给定字符串\(s\),求\(s_{l,r}\)中回文串个数。多组询问,\(|s|\leq5000\),\(T\leq10^5\)。首先介绍\(O(n\timesT)\)的离谱做法(竟然没卡掉),先跑\(Manachar\),然......
  • leetcode-中心扩散法-回文数
    /***<p>给你一个字符串<code>s</code>,找到<code>s</code>中最长的回文子串。</p>**<p>&nbsp;</p>**<p><strong>示例1:</strong></p>**<pre>*<str......
  • 回文自动机(回文树)学习笔记
    回文自动机(回文树)学习笔记前置知识建议提前学习Manacher算法和其他任何一种自动机,方便理解,不过不学问题应该也不大。定义回文自动机(PAM),也称回文树,是存储一个字符串......