cf 1326d2 關於kmp的思維題

2021-10-04 05:54:16 字數 1516 閱讀 8145

題意給你乙個字串,你選擇字串的乙個字首和乙個字尾拼接成乙個回文串,輸出最長的可能的回文串。字首和字尾不能有疊加部分,每組測試樣例包含t個字串。

樣例輸入

1poabbacefop

樣例輸出

poabbaop

思路:你可以先分離出兩邊一樣的部分,比如測試樣例可以變成po + abbacef + op

顯然po是回文的,這時候問題就變成了求abbacef的最長回文字首或者最長回文字尾,可以先求字首,然後翻轉字串,再次求字首(以為是回文的,翻轉不影響答案),比較一下就是答案了。

現在唯一的問題就是求最長回文字首了。

假設abbacef為s,其翻轉為t(fecabba)

可以先考慮用原串去匹配他的翻轉串,求能匹配成功的最大長度就是答案,

可以使用kmp,然後一頓操作就出來了,不過有更簡化的演算法。

設s+"#"+t為m,求m的next陣列,next[m.size()]就是能匹配的最大長度。至於為什麼要加乙個"#",你可以試一下測試資料jiiji。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define linf 0x3f3f3f3f3f3f3f3f

#define ll long long

#define ull unsigned long long

#define uint unsigned int

#define l(x) ((x)<<1)

#define r(x) ((x)<<1|1)

#define ms(a,b) memset(a,b,sizeof(a))

#define nsync std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);

using

namespace std;

const

int n =

2e6+5;

int lps[n]

;int

kmp(

const string& s)

//for (int i = 0; i < len; i++)

// printf(" %c ", s[i]);

//cout << endl;

//for (int i = 0; i <= len; i++)

// printf("%2d ", lps[i]);

//cout << endl;

return lps[len];}

void

solve()

intmain()

關於2d物理引擎box2d與ape的評論

ape不行,做點簡單的撞球,撞球之類遊戲還行。我最開始用他實驗性做了個簡單的基於物理引擎的泡泡龍類遊戲,發現稍微多一點的幾何體堆疊在一起就會產生滲透現象,沒辦法只好更改最初的設計。要專注做物理遊戲,還是要精通box2d才行,而且box2d幾乎任何主流語言都有它的版本。所以建議不要學ape,除非你只是...

cocos2d關於延時的實現

小筆記第九彈了。記得之前有在 記過cocos2d的3種延時實現,現在找不到了,重新整理下。這裡的延時指推遲一段時間後執行某個邏輯,預設是單次執行 1,scheduleonce,系統的排程器去重新整理時間執行,缺點可能就是只能一次呼叫吧 2,scheduleupdate,每幀執行override的up...

unity3d 2d遊戲關於必備元素的解析

說說在unity3d 中製作2d 遊戲的原理。在 unity3d 中繪製貼圖的方式大致可分為兩種,第一種是在 gui中繪製貼圖,第二種是在網格面上繪製貼圖。先說說第一種,gui主要用來製作簡單的遊戲 2d介面,比如遊戲主介面中繪製的 遊戲名稱 開始遊戲 儲存遊戲 退出遊戲 一些按鈕或介面中一切其它的...