#include using namespace std; using ll = long long; template vector z_algorithm(T &S){ vector Z(S.size()); Z[0] = S.size(); int i=1, j=0; while(i < S.size()){ while(i+j < S.size() && S[j] == S[i+j]) j++; Z[i] = j; if (j == 0){ i++; continue; } int k=1; while(k < j && k + Z[k] < j){ Z[i+k] = Z[k]; k++; } i += k; j -= k; } return Z; } //M[2n]...n文字目を中心とする最長回文 //M[2n+1]...n文字目とn+1文字目を中心とする最長回文 template vector manacher(T &s){ string S=""; for (auto x : s){ S += x; S += '$'; } S.pop_back(); vector R(S.size()); int i=0, j=0; while(i < S.size()){ while(i-j >= 0 && i+j < S.size() && S[i-j] == S[i+j]) j++; R[i] = j; int k=1; while(i-k >= 0 && k + R[i-k] < j){ R[i+k] = R[i-k]; k++; } i += k; j -= k; } for (int i=0; i> S; int N=S.size(), mx=0, r; vector R = manacher(S); for (int i=2*N-2; i>=N-1; i--) mx = max(mx, R[i]); for (int i=2*N-2; i>=N-1; i--){ if (mx == R[i]){ //奇数長 if (i % 2 == 0){ r = (R[i]-1)/2; i /= 2; T = S.substr(0, i-r); reverse(T.begin(), T.end()); cout << S << T << endl; return 0; } //偶数長 else{ r = R[i]/2; i /= 2; T = S.substr(0, i-r+1); reverse(T.begin(), T.end()); cout << S << T << endl; return 0; } } } return 0; }