題目描述
國王有乙個魔鏡,可以把任何接觸鏡面的東西變成原來的兩倍——只是,因為是鏡子嘛,增加的那部分是反的。比如一條項鍊,我們用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資料夾。其他路徑同理...