【藍橋杯集訓·每日一題2025】 AcWing 6123. 哞叫時間 python



6123. 哞叫時間

Week 1
2月18日


農夫約翰正在試圖向埃爾茜描述他最喜歡的 USACO 競賽,但她很難理解為什么他這么喜歡它。

他說「競賽中我最喜歡的部分是貝茜說 『現在是哞哞時間』并在整個競賽中一直哞哞叫」。

埃爾茜仍然不理解,所以農夫約翰將競賽以文本文件形式下載,并試圖解釋他的意思。

競賽被定義為一個長度為 N N N 的小寫字母字符串。

一種哞叫一般地定義為子串 c i c j c j c_ic_jc_j ci?cj?cj?,其中某字符 c _ i c\_i c_i 之后緊跟著 2 2 2 個某字符 c j c_j cj?,且 c i ≠ c j c_i \neq c_j ci?=cj?

根據農夫約翰的說法,貝茜哞叫了很多,所以如果某種哞叫在競賽中出現了至少 F F F 次,那可能就是貝茜發出的。

然而,農夫約翰的下載可能損壞,文本文件可能存在至多一個字符與原始文件不同。

將可能的誤差考慮在內,輸出所有可能是貝茜發出的哞叫,按字母順序排序。

輸入格式

輸入的第一行包含 N N N F F F,表示字符串的長度以及貝茜的哞叫的頻次下限。

第二行包含一個長度為 N N N 的小寫字母字符串,表示競賽。

輸出格式

輸出可能是貝茜發出的哞叫的數量,以下是按字典序排序的哞叫列表。

每行輸出一種哞叫。

數據范圍

3 ≤ N ≤ 20000 3 \le N \le 20000 3N20000,
1 ≤ F ≤ N 1 \le F \le N 1FN

輸入樣例1:
10 2
zzmoozzmoo
輸出樣例1:
1
moo
樣例1解釋

在這個樣例中,任何字符變化都不會影響答案。

唯一貝茜可能發出的哞叫是 moo

輸入樣例2:
17 2
momoobaaaaaqqqcqq
輸出樣例2:
3
aqq
baa
cqq
樣例2解釋

在這個樣例中,位置 8 8 8(從零開始索引)的 a 可能是由 b 損壞導致的,這使得 baa 成為一種貝茜發出兩次的可能的哞叫。

此外,位置 11 11 11q 可能是由 c 損壞導致的,這使得 cqq 成為一種貝茜可能的哞叫。

aqq 可以通過將 c 換成 a 來達到。

輸入樣例3:
3 1
ooo
輸出樣例3:
25
aoo
boo
coo
doo
eoo
foo
goo
hoo
ioo
joo
koo
loo
moo
noo
poo
qoo
roo
soo
too
uoo
voo
woo
xoo
yoo
zoo


思路:

兩種枚舉方式:

枚舉所有abb形式
時間復雜度O(26 * 25 * n)

枚舉能變化一次的字母
時間復雜度O(26*n)

code1:

n, f = map(int, input().split())
s = input()
# 生成所有可能的abb組合
abb = []
for i in range(26):for j in range(26):if i != j:str = chr(ord('a') + i) + chr(ord('a') + j) * 2abb.append(str)# 統計每個abb組合的出現次數
cnt = [0] * (26 * 25)
for i in range(len(abb)):pattern = abb[i]for j in range(n - 2):s1 = s[j:j + 3]if s1 == pattern:cnt[i] += 1# 處理出現次數為f-1的情況
for i in range(len(abb)):if cnt[i] == f - 1:pattern = abb[i]for j in range(n - 2):s1 = s[j:j + 3]# 檢查修改是否會影響原有的abb組合sign = 0for x in range(-2, 3):if 0 <= j + x <= n - 3:s2 = s[j + x:j + x + 3]if s2 == pattern:sign = 1breakif sign:continue  # 如果會影響原有的abb組合,跳過# 檢查當前子串是否可以通過修改一個字符變為abb組合if (s1[0] == pattern[0] and s1[1] == pattern[1]) or \(s1[0] == pattern[0] and s1[2] == pattern[2]) or \(s1[1] == pattern[1] and s1[2] == pattern[2]):cnt[i] += 1break  # 只能修改一次ans = []
for i in range(len(abb)):if cnt[i] >= f:ans.append(abb[i])print(len(ans))
for i in sorted(ans):print(i)


code2:

n, f = map(int, input().split())
# 將字符串轉換為0-25的數字表示(a-z)
s = [ord(x) - ord('a') for x in input()]# cnt[i][j] 記錄ijj出現的次數
cnt = [[0] * 26 for _ in range(26)]
ans = []def update(l, r, c):l = max(l, 0)  # 處理左邊界r = min(r, n - 1)  # 處理右邊界for i in range(l, r - 1):  # 遍歷所有可能的3字符窗口起始位置# 檢查是否是abb模式if s[i] != s[i + 1] and s[i + 1] == s[i + 2]:cnt[s[i]][s[i + 2]] += c  # 更新對應模式的計數# 如果達到閾值且是增加操作(c=1)if cnt[s[i]][s[i + 2]] >= f and c == 1:# 轉換為字符串形式ans.append(chr(ord('a') + s[i]) + chr(ord('a') + s[i + 2]) * 2)update(0, n - 1, 1)for i in range(n):  # 遍歷每個可能修改的位置temp = s[i]  # 保存原始字符# 第一步:消除當前字符對周圍的影響(c=-1)update(i - 2, i + 2, -1)  # 修改會影響前后2個位置的模式# 嘗試修改為其他字符for j in range(26):if s[i] != j:  # 跳過與原字符相同的情況s[i] = j  # 臨時修改字符# 第二步:計算修改后的影響(c=1)update(i - 2, i + 2, 1)  # 添加新字符的影響update(i - 2, i + 2, -1)  # 恢復現場s[i] = temp  # 恢復原始字符# 第三步:重新統計原始字符的影響(c=1)update(i - 2, i + 2, 1)
# 去重并排序結果
ans = sorted(set(ans))
print(len(ans))
for i in ans:print(i)

代碼邏輯解釋:

  1. 預處理階段

    • 將輸入字符串轉換為數字形式(a->0, b->1…),方便處理
    • 初始化二維計數數組cnt,用于統計每個abb模式的出現次數
  2. 核心函數update

    • 作用:在指定區間內掃描所有abb模式,并更新計數器
    • 參數c控制增加(1)或減少(-1)計數
    • 通過滑動窗口(每次檢查3個字符)的方式遍歷區間
  3. 主處理流程

    • 初始統計:調用update(0, n-1, 1)統計原始字符串中的所有abb模式
    • 遍歷每個字符位置
      • 先消除當前字符對周圍5個字符范圍(i-2到i+2)的影響
      • 嘗試將該位置修改為其他25個字母(共26種可能)
      • 對每種可能的修改:
        • 臨時修改字符
        • 計算修改后的影響(會覆蓋前后5個字符范圍)
        • 立即回滾修改(為了不影響后續測試其他字符)
      • 最后恢復原始字符并重新統計其影響
  4. 結果處理

    • 使用set去重(可能重復添加相同模式)
    • 按字典序排序后輸出

關鍵優化點:

  • 局部更新:只處理受修改影響的區域(i-2到i+2),而不是全盤重新掃描,將時間復雜度從O(n^2)降低到O(n)
  • 即時回滾:在測試每個可能的字符修改時,立即回滾修改狀態,避免創建多個字符串副本


END
如果有更多問題或需要進一步的幫助,可以在評論區留言討論哦!
如果喜歡的話,請給博主點個關注 謝謝

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

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

相關文章

C++,設計模式,【工廠方法模式】

文章目錄 如何用汽車生產線理解工廠方法模式?一、傳統生產方式的困境二、工廠方法模式解決方案三、模式應用場景四、模式優勢分析五、現實應用啟示?C++,設計模式,【目錄篇】 如何用汽車生產線理解工廠方法模式? 某個早晨,某車企CEO看著會議室里堆積如面的新車訂單皺起眉…

貪心算法

int a[1000], b5, c8; swap(b, c); // 交換操作 memset(a, 0, sizeof(a)); // 初始化為0或-1 引導問題 為一個小老鼠準備了M磅的貓糧&#xff0c;準備去和看守倉庫的貓做交易&#xff0c;因為倉庫里有小老鼠喜歡吃的五香豆&#xff0c;第i個房間有J[i] 磅的五香豆&#xf…

機器學習·數據處理

前言 對于大規模數據&#xff0c;我們經常會使用python內置函數或者編寫腳本進行批量化處理&#xff0c;從而提高后續使用算法的效率。 1. 正則表達式 定義&#xff1a;用于檢索、替換符合某個模式的文本&#xff0c;是文本預處理常用技術。基本語法 符號描述.匹配除換行符 …

大廠出品!三個新的 DeepSeek 平替網站

前幾天給大家分享了幾個 DeepSeek 免費平替網站&#xff0c;今天又來更新啦。 新增了以下三個平臺&#xff1a;火山引擎、知乎直達、百度搜索。 經過實際測試&#xff0c;這幾個平臺的服務響應速度快&#xff0c;穩定性表現優異&#xff0c;基本不會出現宕機或服務器繁忙的情…

[創業之路-321]:創新開拓思維和經營管理思維的比較

目錄 一、概述 1.1、定義與內涵 1、創新開拓思維&#xff1a; 2、經營管理思維&#xff1a; 1.2、特點與優勢 1、創新開拓思維的特點與優勢&#xff1a; 2、經營管理思維的特點與優勢&#xff1a; 3、應用場景與限制 4、總結 二、創新開拓思維與經營管理思維&#xf…

《深度學習實戰》第1集:深度學習基礎回顧與框架選擇

本專欄系列博文旨在幫助讀者從深度學習的基礎知識逐步進階到前沿技術&#xff0c;涵蓋理論、實戰和行業應用。每集聚焦一個核心知識點&#xff0c;并結合實際項目進行實踐&#xff0c;避免空談理論&#xff0c;簡潔明快&#xff0c;快速切入代碼&#xff0c;所有代碼都經過驗證…

經典復古嘻哈說唱朋克風格專輯海報標題設計psai英文字體安裝包 Punk Of Sad — Ransom Font

Punk Of Sad 將確保您忘記所有簡潔的線條和企業潤色。這種經典的贖金風格字體是一封寫給 DIY 文化的情書&#xff0c;誕生于雜志、演出海報和地下場景的原始能量的剪切和粘貼混亂。每個字母都是不可預測的&#xff0c;都帶有叛逆的邊緣。 這種字體有三種不同的樣式 – Regular…

hot100-滑動窗口

3. 無重復字符的最長子串 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長子串的長度。 思路&#xff1a;雙指針指向不含重復字符的連續字串的頭和尾&#xff0c;用集合存儲子串中的元素&#xff0c;有重復時&#xff0c;左指針持續右移&#xff0c;無重復后…

MariaDB 歷史版本下載地址 —— 筑夢之路

MariaDB 官方yum源里面只有目前在維護的版本&#xff0c;而有時候對于老項目來說還是需要老版本的rpm包&#xff0c;國內很多鏡像站都是同步的官方倉庫&#xff0c;因此下載老版本也不好找&#xff0c;這里主要記錄下從哪里可以下載到歷史版本的MariaDB rpm包。 1. 官方歸檔網…

Linux-Ansible模塊進階

文章目錄 Copy和FetchFile模塊 Copy和Fetch copy和fetch模塊實踐 copy模塊需要注意的點&#xff1a;在收集日志之前需要對文件先進行改名或者備份fetch模塊需要注意的點&#xff1a;復制的源文件的路徑必須是文件不能是目錄建議全部使用絕對路徑&#xff0c;別使用相對路徑確保…

網絡空間安全(1)web應用程序的發展歷程

前言 Web應用程序的發展歷程是一部技術創新與社會變革交織的長卷&#xff0c;從簡單的文檔共享系統到如今復雜、交互式、數據驅動的平臺&#xff0c;經歷了多個重要階段。 一、起源與初期發展&#xff08;1989-1995年&#xff09; Web的誕生&#xff1a; 1989年&#xff0c;歐洲…

國產開源PDF解析工具MinerU

前言 PDF的數據解析是一件較困難的事情&#xff0c;幾乎所有商家都把PDF轉WORD功能做成付費產品。 PDF是基于PostScript子集渲染的&#xff0c;PostScript是一門圖靈完備的語言。而WORD需要的渲染&#xff0c;本質上是PDF能力的子集。大模型領域&#xff0c;我們的目標文件格…

Powershell Install deepseek

前言 deepseekAI助手。它具有聊天機器人功能&#xff0c;可以與用戶進行自然語言交互&#xff0c;回答問題、提供建議和幫助解決問題。DeepSeek 的特點包括&#xff1a; 強大的語言理解能力&#xff1a;能夠理解和生成自然語言&#xff0c;與用戶進行流暢的對話。多領域知識&…

6. 【.NET 8 實戰--孢子記賬--從單體到微服務--轉向微服務】--微服務基礎工具與技術--Ocelot 網關--概念與簡單入門

網關是一種位于客戶端和后端服務之間的服務&#xff0c;充當所有客戶端請求的單一入口。它的主要職責是接收所有的API調用&#xff0c;匯總各類請求&#xff0c;將其路由到適當的后端服務&#xff0c;并將響應返回給客戶端。網關不僅僅是一個簡單的反向代理&#xff0c;它還能夠…

網頁制作06-html,css,javascript初認識のhtml如何建立超鏈接

超鏈接有外部鏈接、電子郵件鏈接、錨點鏈接、空鏈接、腳本鏈接 一、內部鏈接 與自身網站頁面有關的鏈接被稱為內部鏈接 1、創建內部鏈接 1&#xff09;語法&#xff1a; <a href"鏈接地址"> …… </a> 2&#xff09;舉例應用&#xff1a; 3&#xf…

MySQL后端返回給前端的時間變了(時區問題)

問題&#xff1a;MySQL里的時間例如為2025-01-10 21:19:30&#xff0c;但是返回到前端就變成了2025-01-10 13:19:30&#xff0c;會出現小時不一樣或日期變成隔日的問題 一般來說設計字段時會使用datetime字段類型&#xff0c;這是一種用于時間的字段類型&#xff0c;而這個類型…

【算法與數據結構】單調隊列

目錄 單調隊列 使用單調隊列維護滑動窗口 具體過程&#xff1a; 代碼實現&#xff1a; 復雜度分析&#xff1a; 使用單調隊列優化動態規劃 例題 單調隊列 單調隊列(deque)是一種特殊的隊列&#xff0c;隊列中的元素始終按嚴格遞增或者遞減排列。這樣就可以保證隊頭元素…

AutoGen 技術博客系列 九:從 v0.2 到 v0.4 的遷移指南

本系列博文在掘金同步發布, 更多優質文章&#xff0c;請關注本人掘金賬號&#xff1a; 人肉推土機的掘金賬號 AutoGen系列一&#xff1a;基礎介紹與入門教程 AutoGen系列二&#xff1a;深入自定義智能體 AutoGen系列三&#xff1a;內置智能體的應用與實戰 AutoGen系列四&am…

深度學習每周學習總結Y1(Yolov5 調用官方權重進行檢測 )

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客Y1中的內容 &#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制 ** 注意該訓練營出現故意不退押金&#xff0c;惡意揣測偷懶用假的結果冒充真實打卡記錄&#xff0c;在提出能夠拿到視頻錄像…

為AI聊天工具添加一個知識系統 之117 詳細設計之58 思維導圖及觀察者效應 之2 概念全景圖

&#xff08;說明&#xff1a;本文和上一篇問題基本相同&#xff0c;但換了一個模型 deepseek-r1&#xff09; Q1227、在提出項目“為使用AI聊天工具的聊天者加掛一個專屬的知識系統”后&#xff0c;我們已經進行了了大量的討論-持續了近三個月了。這些討論整體淋漓盡致體現了…