#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using ld = long double; #define all(v) v.begin(), v.end() #define rep(i, n) for (ll i = 0; i < n; ++i) #define rep2(i, n, m) for (ll i = n; i <= m; ++i) #define rep3(i, n, m) for (ll i = n; i >= m; --i) template using pqg = priority_queue, greater>; template using pq = priority_queue; template inline bool chmax(S &a, T b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(S &a, T b) { if (a > b) { a = b; return true; } return false; } constexpr int MOD = 1000000007; int pow2[10005]; int main() { string s; cin >> s; int n = s.size(); pow2[0] = 1; rep(i, 10004) pow2[i+1] = (pow2[i] * 2) % MOD; vector ts; int sum = 0; string a, b, c; rep(i, n/2) { a += s[i]; b = s[n-i-1] + b; if (a == b) { ts.push_back(a); sum += a.size(); a = b = ""; } } c = s.substr(sum, n - 2 * sum); int ans = 0, streak = 0; string last; for (string t : ts) { if (t == last) { ++streak; } else { ans += pow2[streak]; ans %= MOD; streak = 0; } } bool isPalin = false; string d = c; reverse(all(c)); if (d == c) isPalin = true; if (isPalin) ans += ts.size(); else ++ans; ans %= MOD; cout << ans << endl; return 0; }