題意給你乙個字串,你選擇字串的乙個字首和乙個字尾拼接成乙個回文串,輸出最長的可能的回文串。字首和字尾不能有疊加部分,每組測試樣例包含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介面,比如遊戲主介面中繪製的 遊戲名稱 開始遊戲 儲存遊戲 退出遊戲 一些按鈕或介面中一切其它的...