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+1?i?。請你判斷該目的是否能達成,如果可以,請輸出字典序最小的操作方案,具體在【輸出格式】中說明。

輸入格式

每個測試點包含多組測試數據。

輸入的第一行,包含一個整數 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+1?i?
  • 字典序最小:優先嘗試 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
英文地址,請注明出處:http://en.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;反向傳播 梯度下降法 (調整權…