Problem:
Score : 200 points

Problem Statement

A string S of an odd length is said to be a strong palindrome if and only if all of the following conditions are satisfied:

S is a palindrome.

Let N be the length of S. The string formed by the 1-st through ((N-1)/2)-th characters of S is a palindrome.

The string consisting of the (N+3)/2-st through N-th characters of S is a palindrome.

Determine whether S is a strong palindrome.

Constraints

S consists of lowercase English letters.

The length of S is an odd number between 3 and 99 (inclusive).

Input

Input is given from Standard Input in the following format:

S

Output

If S is a strong palindrome, print Yes;
otherwise, print No.

Sample Input 1

akasaka

Sample Output 1

Yes

S is akasaka.

The string formed by the 1-st through the 3-rd characters is aka.

The string formed by the 5-th through the 7-th characters is aka.
All of these are palindromes, so S is a strong palindrome.

Sample Input 2

level

Sample Output 2

No

Sample Input 3

atcoder

Sample Output 3

No

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i < (n); ++i)
using namespace std;
typedef long long ll;

#define check(val) std::cout << "\033[31m" << #val << ": " << val << "\033[m" << std::endl
#define check_v(vec)                                                    \
  std::cout << "\033[31m" << #vec << ": [ ";                            \
  for(auto it=vec.begin(); it!=vec.end(); it++){cout << *it << " ";}    \
  cout << "]"<< "\033[m" << endl;

int kaibun(string s){
  int n = s.length();
  rep(i, n/2){
    // cout << s[i] << s[n - i - 1] << endl;
    if(s[i] == s[n - i - 1]) {
      continue;
    }
    else {
      return -1;
    }
  }
  return 0;
}

int main() {
  string s;
  cin >> s;
  int n = s.length();
  string s1;
  rep(i, (n-1)/2) {
    s1.push_back(s[i]);
  }
  string s2;
  for(int i=(n+3)/2-1; i<n; ++i){
    s2.push_back(s[i]);
  }
  // cout << "result: " << kaibun(s) << endl;
  // kaibun(s1);
  if(kaibun(s) == 0 && kaibun(s1) == 0 && kaibun(s2) == 0) {
    cout << "Yes" << endl;
    return 0;
  }
  // check(s);
  // check(s1);
  // check(s2);

  cout << "No" << endl;
  return 0;
}