// C++ program for building LCP array for given text
#include <bits/stdc++.h>
#include <vector>
#include <string>
#include <time.h>
using namespace std;
#define MAX 100000
#define mod 1000000007
struct suffix
{
int index;
int rank[2];
};
int cmp(struct suffix a, struct suffix b)
{
return (a.rank[0] == b.rank[0])? (a.rank[1] < b.rank[1] ?1: 0):
(a.rank[0] < b.rank[0] ?1: 0);
}
vector<int>suffixArr;
void buildSuffixArray(string txt, int n)
{
struct suffix suffixes[n];
for (int i = 0; i < n; i++)
{
suffixes[i].index = i;
suffixes[i].rank[0] = txt[i] - 'a';
suffixes[i].rank[1] = ((i+1) < n)? (txt[i + 1] - 'a'): -1;
}
sort(suffixes, suffixes+n, cmp);
int ind[n];
for (int k = 4; k < 2*n; k = k*2)
{
int rank = 0;
int prev_rank = suffixes[0].rank[0];
suffixes[0].rank[0] = rank;
ind[suffixes[0].index] = 0;
for (int i = 1; i < n; i++)
{
if (suffixes[i].rank[0] == prev_rank &&
suffixes[i].rank[1] == suffixes[i-1].rank[1])
{
prev_rank = suffixes[i].rank[0];
suffixes[i].rank[0] = rank;
}
else
{
prev_rank = suffixes[i].rank[0];
suffixes[i].rank[0] = ++rank;
}
ind[suffixes[i].index] = i;
}
for (int i = 0; i < n; i++)
{
int nextindex = suffixes[i].index + k/2;
suffixes[i].rank[1] = (nextindex < n)?
suffixes[ind[nextindex]].rank[0]: -1;
}
sort(suffixes, suffixes+n, cmp);
}
for (int i = 0; i < n; i++)
suffixArr.push_back(suffixes[i].index);
}
bool isSuffix (string &str, int iStart, int iEnd, int jStart)
{
for (int i = iStart, j = jStart; i <= iEnd; i++, j++)
if (str[i] != str[j])
return false;
return true;
}
void isPalin(string &str, int i, int j, int &count)
{
int start = i;
int end = j;
while (i < end)
{
if (str[i] == str[j])
{
if (isSuffix(str, start, i, j))
{
count++;
count %= mod;
}
i++, j--;
}
else
{
break;
}
}
}
int main()
{
int t;
//cin >> t;
t = 1;
while (t > 0) {
string str;
cin >> str;
int start_s = clock();
buildSuffixArray(str, str.length());
int n = suffixArr.size();
int count = 0;
for(int i = 0;i < n;i++) {
int begin_suffix = suffixArr[i];
int end_suffix = n - suffixArr[i];
for (int j = 1; j <= end_suffix; j++) {
if (j >= 2) {
int left = begin_suffix;
int right = begin_suffix + j - 1;
isPalin(str, left, right, count);
}
}
}
cout << count << endl;
int stop_s = clock();
float run_time = (stop_s - start_s) / double(CLOCKS_PER_SEC);
cout << endl << "palindromic borders \t\tExecution time = " << run_time << " seconds" << endl;
t--;
}
return 0;
}