#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; class ManacherAlgorithm { private: static void solve(const string& s, vector& len) { int n = s.size(); int i = 0; int j = 0; len.resize(n); while (i < n) { while(i-j >= 0 && i+j < n && s[i-j] == s[i+j]) ++ j; len[i] = j; int k = 1; while(i-k >= 0 && i+k < n && k+len[i-k] < j){ len[i+k] = len[i-k]; ++ k; } i += k; j -= k; } } public: static void getPalindromeLen(const string& s, vector& len) { int n = s.size(); string t(2*n-1, '$'); for(int i=0; i oddLen, evenLen; solve(s, oddLen); solve(t, evenLen); len.assign(2*n-1, 0); for(int i=0; i 1) len[2*i+1] = evenLen[2*i+1]; } } }; int main() { string s; cin >> s; int n = s.size(); vector len; ManacherAlgorithm::getPalindromeLen(s, len); vector cnt(n, 0); for(int a=1; a= b) ++ cnt[a+b]; } } int tmp = 0; long long ans = 0; for(int a=1; a= a) ++ tmp; ans += tmp * (long long)cnt[n-1-a]; } cout << ans << endl; return 0; }