SRM428 DIV2 250 ThePalindrome
sの先頭からi文字をひっくり返したものをtとする。
sの末尾にtをつけたものが回文になってるかどうかを試していく。
例えば、s="abcccc" の場合
i=0:
t="" (空文字列)
s+t="abccc" ←回文じゃない
i=1:
t="a"
s+t="abccca" ←回文じゃない
i=2:
t="ba"
s+t="abcccba" ←回文!これの長さを返す
#include <string> #include <algorithm> using namespace std; class ThePalindrome { bool ok(const string& s) { int n=s.size(); for(int i=0;i<n/2;++i) if (s[i]!=s[n-i-1]) return false; return true; } public: int find(string s) { for(int i=0;i<s.size();++i) { string t=s.substr(0,i); // 先頭からi文字を取り出して reverse(t.begin(),t.end()); // ひっくり返して t=s+t; // sの末尾にくっつける if (ok(t)) return t.size(); } return 0; } };