【棧】-----【小C的記事本】

小C的記事本

題目描述

小C最近學會了 Java 小程序的開發,他很開心,于是想做一個簡單的記事本程序練練手。
他希望他的記事本包含以下功能:

  1. append(str):向記事本插入字符串 str(英文字符)。
  2. delete(k):刪除記事本最后 k 個字符(保證不為空串)。
  3. print(k):輸出記事本第 k 個字符(保證不為空串)。
  4. undo():撤銷最近的 appenddelete 操作,使記事本回到該操作之前的狀態。

可憐的小C琢磨了半天還是做不來,聰明的你能解決小C的問題嗎?


輸入描述

  • 多組輸入。

  • 每組輸入第一行是一個整數 q,代表操作總數。

  • 接下來 q 行每行描述一個操作,每行以一個整數 t 開頭 ( 1 ≤ t ≤ 4 ) (1 \le t \le 4) 1t4

    • 若操作需要參數,則在 t 后用空格分隔給出參數。
  • 題目保證所有操作均合法

  • 約束條件:

    • 1 ≤ q ≤ 10 6 10^6 106
    • 每個測試數據中所有 append 字符串總長度 字符串總長度 字符串總長度 ≤ \le 10 6 10^6 106
  • 提示:請使用 ios::sync_with_stdio(false); 等手段對讀寫進行加速。


輸出描述

  • 對于每個 print(k) 操作,輸出記事本當前狀態下第 k 個字符,每個輸出后換行。

示例

輸入

8
1 ab
3 2
2 2
1 cd
3 1
4
4
3 1

輸出

b
c
a

樣例解釋

假設記事本內容用字符串 S 表示:

  1. 操作 1 ab:插入 "ab",此時 S = "ab".
  2. 操作 3 2:輸出第 2 個字符,是 b.
  3. 操作 2 2:刪除最后 2 個字符,S = "".
  4. 操作 1 cd:插入 "cd",S = "cd".
  5. 操作 3 1:輸出第 1 個字符,是 c.
  6. 操作 4:撤銷,上一次是 append("cd"),撤銷后 S = "".
  7. 操作 4:再撤銷,上一次是刪除操作,撤銷后 S = "ab".
  8. 操作 3 1:輸出第 1 個字符,是 a.

#include <bits/stdc++.h>
using namespace std;int main() 
{ios::sync_with_stdio(false);cin.tie(nullptr);int q;// 支持多組輸入:當能讀入 q 時就處理一組while (cin >> q) {// 當前文本內容,初始為空string S;S.reserve(1000000);  // 預留,避免多次擴容// 操作歷史棧:pair.first 表示操作類型(1=append, 2=delete),// pair.second 存儲對應的字符串(append 時存被添加的 str,delete 時存被刪除的部分)stack<pair<int, string>> history;while (q--) {int t;cin >> t;if (t == 1) {// append(str)string str;cin >> str;// 將 str 追加到 S 末尾S += str;// 記錄這次 append 操作及內容,以便 undo 時刪除history.push({1, str});}else if (t == 2) {// delete(k)int k;cin >> k;// 取出要刪除的末尾 k 個字符// 注意題目保證 k <= |S|string removed = S.substr(S.size() - k);// 刪除末尾 k 個字符S.resize(S.size() - k);// 記錄這次 delete 操作及被刪除的內容,以便 undo 時恢復history.push({2, removed});}else if (t == 3) {// print(k)int k;cin >> k;// 題目保證 1 <= k <= |S|// 輸出第 k 個字符,下標從 1 開始cout << S[k - 1] << '\n';}else if (t == 4) {// undo()if (!history.empty()) {auto p = history.top();history.pop();if (p.first == 1) {// 撤銷 append:刪掉上次 append 的內容長度int len = (int)p.second.size();// 題目保證之前 append 的內容確實在末尾S.resize(S.size() - len);} else {// 撤銷 delete:恢復上次 delete 時刪除的內容// 把被刪除的字符串重新追加到末尾S += p.second;}}}// 題目保證輸入的 t 只會是 1~4,且操作合法,不必額外 else 分支}// 處理完一組后,如果有多組,則繼續 next while(cin>>q)}return 0;
}

詳細題解后續更新

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84827.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84827.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84827.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

技能系統詳解(2)——特效表現

特效會有個EffectManager用于統一管理所有特效&#xff0c;技能特效只是各類特效中的一種 EffectManager需要提供特效的創建&#xff0c;返回被封裝為EffectHandle 每類特效都有各種不同的配置參數&#xff0c;這些配置參數會傳遞給EffectManager用于生成EffectHandler 為支…

12.OpenCV—基礎入門

01讀取圖像 02創建空白圖像 03保存圖像 04更改圖像亮度 05更改圖像對比度 06灰度直方圖均衡 07彩色直方圖均衡 08五種濾波方式 09形態學操作 10仿射變換 11角度縮放仿射變換 12透視變換 13坐標映射 14模板匹配 15多模板匹配 16查找輪廓線 17輪廓線匹配 17繪制…

【Python】Python之什么是生成器?什么是迭代器?

目錄 專欄導讀前言什么是迭代器&#xff08;Iterator&#xff09;&#xff1f;迭代器的定義迭代器協議可迭代對象 vs 迭代器自定義迭代器迭代器的優勢 什么是生成器&#xff08;Generator&#xff09;&#xff1f;生成器的定義生成器函數生成器表達式復雜的生成器示例生成器的狀…

Python中實現簡單爬蟲并處理數據

在當今數據驅動的時代&#xff0c;能夠從互聯網上高效地抓取信息變得越來越重要。Python因其簡潔易學的特性&#xff0c;成為了編寫網絡爬蟲的首選語言之一。接下來&#xff0c;我將介紹如何使用Python來實現一個基礎的網絡爬蟲&#xff0c;并對收集到的數據進行初步處理。 首先…

免費wordpress主題網

免費WordPress主題網 WP模板牛 WP模板牛是一個提供免費WordPress主題的網站&#xff0c;用戶可以在這里找到大量高質量的模板&#xff0c;適用于各種網站類型。該網站致力于為用戶提供簡單、高效的建站體驗。 官網鏈接&#xff1a; https://wpniu.com 建站哥模板 建站哥模板…

為什么需要MyBatis-Plus條件構造器?

目錄 前言 一、傳統SQL編寫的痛點 二、條件構造器的核心優勢 1. 防SQL注入&#xff08;安全性&#xff09; 2. 面向對象編程&#xff08;可讀性&#xff09; 3. 動態條件構建&#xff08;靈活性&#xff09; 4. 數據庫無關性&#xff08;可移植性&#xff09; 三、典型應…

【從零學習JVM|第九篇】常見的垃圾回收算法和垃圾回收器

前言&#xff1a; 我們知道在堆內存中&#xff0c;會有自動的垃圾回收功能&#xff0c;那今天這篇文章將會向你介紹&#xff0c;這個功能實現的方式&#xff0c;還有實現的對象&#xff0c;接下來就由我來給你們詳細介紹垃圾回收的算法和實現算法的回收器。 目錄 前言&#…

品牌竄貨治理解決方案

在渠道網絡的暗潮中&#xff0c;竄貨猶如隱秘的漩渦&#xff0c;某知名白酒品牌曾因區域竄貨導致終端價格體系崩潰&#xff0c;半年內損失超3億元。竄貨行為不僅破壞市場秩序&#xff0c;更會引發信任危機。隨著電商平臺的多元化與分銷層級的復雜化&#xff0c;品牌方亟需構建一…

車載電子電器架構 --- 法律和標準對電子電氣架構的影響

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

一種通用跨平臺實現SEH的解決方案

一. 前言 眾所周知&#xff0c;在軟件的代碼中&#xff0c;處理軟件本身的邏輯只要大約1/3的代碼&#xff0c;另外2/3的代碼實際上是在處理各種各樣的異常情況。 這些異常情況一方面是因為不同用戶之間不同的硬件軟件環境要處理。另一方面是程序中可能出現的bug。比較典型的情…

25.6.19學習總結

什么是堆&#xff08;Heap&#xff09;&#xff1f; 堆是一種特殊的樹形數據結構&#xff0c;它滿足以下兩個主要屬性&#xff1a; 結構性&#xff08;完全二叉樹&#xff09;&#xff1a; 堆總是一個完全二叉樹 (Complete Binary Tree)。這意味著&#xff0c;除了最后一層&am…

【前后前】導入Excel文件閉環模型:Vue3前端上傳Excel文件,【Java后端接收、解析、返回數據】,Vue3前端接收展示數據

【前后前】導入Excel文件閉環模型&#xff1a;Vue3前端上傳Excel文件&#xff0c;【Java后端接收、解析、返回數據】&#xff0c;Vue3前端接收展示數據 一、Vue3前端上傳&#xff08;導入&#xff09;Excel文件 ReagentInDialog.vue <script setup lang"ts" na…

網絡基礎入門:從OSI模型到TCP/IP協議詳解

網絡基礎入門&#xff1a;從OSI模型到TCP/IP協議詳解 一、網絡基礎概念與OSI七層模型 1.1 網絡通信的本質 計算機網絡的核心是將抽象語言轉換為二進制數據進行傳輸與計算&#xff0c;這一過程涉及多層抽象與轉換&#xff1a; 應用層&#xff1a;人機交互—抽象語言------編…

Linux致命漏洞CVE-2025-6018和CVE-2025-6019

Qualys 最近披露了兩個影響主流 Linux 發行版的本地權限提升 (LPE) 漏洞&#xff0c;分別是 CVE-2025-6018 和 CVE-2025-6019。這兩個漏洞可以被串聯利用&#xff0c;使得非特權用戶在幾秒鐘內獲得系統的 root 權限&#xff0c;從而實現對系統的完全控制。 一、漏洞詳情 這兩…

【Docker基礎】Docker鏡像管理:docker push詳解

目錄 引言 1 Docker鏡像推送基礎概念 1.1 什么是Docker鏡像推送 1.2 鏡像倉庫概述 1.3 鏡像標簽與版本控制 2 docker push命令詳解 2.1 基本語法 2.2 常用參數選項 2.3 實際命令示例 2.4 推送流程 2.5 步驟描述 3 鏡像推送實踐示例 3.1 登錄管理 3.2 標簽管理 3…

FPGA基礎 -- Verilog行為建模之循環語句

行為級建模&#xff08;Behavioral Modeling&#xff09;是 Verilog HDL 中最接近軟件編程語言的一種描述方式&#xff0c;適用于功能建模和仿真建模的初期階段。在行為級中&#xff0c;循環語句&#xff08;loop statements&#xff09;是常見且重要的控制結構&#xff0c;用于…

從C學C++(7)——static成員

從C學C(7)——static成員 若無特殊說明&#xff0c;本博客所執行的C標準均為C11. static成員和成員函數 對于特定類型的全體對象而言&#xff0c;有時候可能需要訪問一個全局的變量。比如說統計某種類型對象已創建的數量。 通常在C中使用全局變量來實現&#xff0c;如果我們…

大模型和ollama一起打包到一個docker鏡像中

如何將大模型鏡像和 Ollama 鏡像打包在一個 Docker 鏡像中 最近工作中有個需求是將ollama和大模型一起打成一個鏡像部署&#xff0c;將自己的操作步驟分享給大家。將大模型與 Ollama 服務打包在同一個 Docker 鏡像中&#xff0c;可以簡化部署流程并確保環境一致性。下面詳細介…

2025年滲透測試面試題總結-攻防研究員(應用安全)(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 攻防研究員(應用安全) 一、基礎部分 1. HTTP狀態碼對比 2. HTTP請求方法核心作用 3. 網絡分層協議速查表…

SpringBoot新聞項目學習day3--后臺權限的增刪改查以及權限管理分配

新增管理員修改管理員刪除管理員登錄 新增管理員 1.點擊新增按鈕打開一個對話框 2.確定新增對話框要顯示哪些內容 3.提交 4.后端處理、保存 5.響應前端 vue代碼 <template><!-- 新增代碼內容是比較多的,建議抽取出來,定義到一個獨立的vue文件中在列表組件中導入…