洛谷P2799 國王的墨鏡 題解 遞迴

2022-05-19 22:02:34 字數 1181 閱讀 4078

題目描述

國王有乙個魔鏡,可以把任何接觸鏡面的東西變成原來的兩倍——只是,因為是鏡子嘛,增加的那部分是反的。比如一條項鍊,我們用ab來表示,不同的字母表示不同顏色的珍珠。如果把b端接觸鏡面的話,魔鏡會把這條項鍊變為abba。如果再用一端接觸的話,則會變成abbaabba(假定國王只用項鍊的某一端接觸魔鏡)。給定最終的項鍊,請編寫程式輸出國王沒使用魔鏡之前,最初的項鍊可能的最小長度。

輸入格式

只有乙個字串,由大寫英文本母組成(字母數<=100000),表示最終的項鍊。

輸出格式

只有乙個整數,表示國王沒使用魔鏡前,最初的項鍊可能的最小長度。

樣例輸入

abbaabba
樣例輸出
2
題目分析

本題涉及演算法:遞迴。

首先你思考一下,如果給你乙個長度為 \(n\) 的字串 \(s\),你需要判斷它是否是軸對稱,並且還不能是奇數的:

如果 \(n\) 為偶數並且 \(s[0..n-1]\) 是軸對稱的,那麼我們繼續去判斷 \(s[0..n-1]\) 的前 \(n/2\) 個元素組成的子串;

如果 \(n/2\) 為偶數並且 \(s[0..\frac-1]\) 是軸對稱的,那麼我們繼續去判斷 \(s[0..\frac-1]\) 的前 \(n/4\) 個元素組成的子串;

……如是迴圈,直到我們找到乙個 \(n\) 為奇數或者它不是軸對稱的。這個時候對應的 \(n\) 就是我們想要的最小的長度。

我們可以開乙個函式int check(string s, int n),它用於判斷字串 \(s\) 的前 \(n\) 的最小長度,

如果 \(n\) 是奇數 或者 \(s\) 不是軸對稱的,該函式直接返回 \(n\) ,說明 \(n\) 就是它的最小程度;

否則,它是偶數長度並且是軸對稱的,那麼它返回的結果就是check(s, n/2)的值。

按這種方法進行遞迴,最終能找到我們想要的答案。

實現**如下:

#include using namespace std;

// check函式用於返回s的前n個字元能夠組成的最小長度

int check(string s, int n)

string s;

int n;

int main()

洛谷P2799國王的魔鏡

國王有乙個魔鏡,可以把任何接觸鏡面的東西變成原來的兩倍 只是,因為是鏡子嘛,增加的那部分是反的。比如一條項鍊,我們用ab來表示,不同的字母表示不同顏色的珍珠。如果把b端接觸鏡面的話,魔鏡會把這條項鍊變為abba。如果再用一端接觸的話,則會變成abbaabba 假定國王只用項鍊的某一端接觸魔鏡 給定最...

洛谷 p1080國王遊戲 題解

include include include include include p1080 國王遊戲 輸入1 大臣數n 2 國王左手數 國王右手數 3 n 2 大臣左手數 大臣右手數 輸出 獲得金幣最多的大臣獲得金幣數量 using namespace std int king left 0,kin...

題解 洛谷P1738 洛谷的資料夾

一 目錄概覽 二 題目大意 三 大致思路 四 實現 五 剖析 六 總結回顧 kkksc03想好了很多應該有的資料夾路徑名。問題是,需要是使這些資料夾都存在,需要新建幾個資料夾呢?資料夾路徑是什麼?例如 a b c,表示在根目錄下有a資料夾,在a資料夾裡有b資料夾,在b資料夾裡有c資料夾。其他路徑同理...