#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 1e9 + 7;
int n;
string s;
int what_subtask() {
if (n <= 20) return 1;
if (n <= 1000) return 2;
return 3;
}
void add(int& a, int b) {
a = (a + b) % MOD;
if (a < 0) a += MOD;
}
namespace sub1 {
int ans;
bool ok(const string& t) {
int sz = t.size();
for (int i = 0; i + 1 < sz; i++) {
if (i % 2 == 0) {
if (t[i] >= t[i + 1]) return false;
}
else {
if (t[i] <= t[i + 1]) return false;
}
}
return true;
}
void backtrack(int i, string& t) {
if (i == n + 1) {
ans += ok(t);
return;
}
backtrack(i + 1, t);
t += s[i];
backtrack(i + 1, t);
t.pop_back();
}
void solve() {
string t = "";
ans = 0;
backtrack(1, t);
cout << ans - 1 << '\n';
}
}
namespace sub2 {
const int N = 1e3 + 5;
int dp[N][2]; // 0 chẵn, 1 lẻ
void solve() {
for (int i = 1; i <= n; i++) {
dp[i][1] = 1; // xâu chỉ chứa 1 kí tự s[i]
for (int parity = 0; parity <= 1; parity++) {
for (int j = 1; j < i; j++) {
if (parity == 0 && s[j] < s[i]) {
add(dp[i][parity], dp[j][parity ^ 1]);
}
if (parity == 1 && s[j] > s[i]) {
add(dp[i][parity], dp[j][parity ^ 1]);
}
}
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int parity = 0; parity <= 1; parity++) {
add(ans, dp[i][parity]);
}
}
cout << ans << '\n';
}
}
namespace sub3 {
const int N = 1e6 + 5;
int dp[N][2]; // 0 chẵn, 1 lẻ
int sum[2][26];
int getSum(int parity, int l, int r) {
if (l > r) return 0;
return sum[parity][r] - ((l <= 0) ? 0 : sum[parity][l - 1]);
}
void solve() {
for (int i = 1; i <= n; i++) {
dp[i][1] = 1; // xâu chỉ chứa 1 kí tự s[i]
for (int parity = 0; parity <= 1; parity++) {
if (parity == 0) {
add(dp[i][0], getSum(1, 0, (s[i] - 'A') - 1));
}
if (parity == 1) {
add(dp[i][1], getSum(0, (s[i] - 'A') + 1, 25));
}
}
for (int parity = 0; parity <= 1; parity++) {
for (int c = (s[i] - 'A'); c <= 25; c++) add(sum[parity][c], dp[i][parity]);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int parity = 0; parity <= 1; parity++) {
add(ans, dp[i][parity]);
}
}
cout << ans << '\n';
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> s;
n = s.size();
s = ' ' + s;
int subtask = what_subtask();
if (subtask == 1) sub1::solve();
if (subtask == 2) sub2::solve();
if (subtask == 3) sub3::solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgIAoKaW50IG47ICAKc3RyaW5nIHM7CgppbnQgd2hhdF9zdWJ0YXNrKCkgewoJaWYgKG4gPD0gMjApIHJldHVybiAxOyAgCSAKCWlmIChuIDw9IDEwMDApIHJldHVybiAyOyAKCXJldHVybiAzOyAKfQoKdm9pZCBhZGQoaW50JiBhLCBpbnQgYikgewoJYSA9IChhICsgYikgJSBNT0Q7ICAKCWlmIChhIDwgMCkgYSArPSBNT0Q7ICAKfQoKbmFtZXNwYWNlIHN1YjEgewoJaW50IGFuczsgICAgCgoJYm9vbCBvayhjb25zdCBzdHJpbmcmIHQpIHsKCQlpbnQgc3ogPSB0LnNpemUoKTsgCgkJZm9yIChpbnQgaSA9IDA7IGkgKyAxIDwgc3o7IGkrKykgewoJCQlpZiAoaSAlIDIgPT0gMCkgewoJCQkJaWYgKHRbaV0gPj0gdFtpICsgMV0pIHJldHVybiBmYWxzZTsgCgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAodFtpXSA8PSB0W2kgKyAxXSkgcmV0dXJuIGZhbHNlOyAKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsgIAoJfQoKCXZvaWQgYmFja3RyYWNrKGludCBpLCBzdHJpbmcmIHQpIHsKCQlpZiAoaSA9PSBuICsgMSkgewoJCQlhbnMgKz0gb2sodCk7IAoJCQlyZXR1cm47IAoJCX0KCgkJYmFja3RyYWNrKGkgKyAxLCB0KTsgIAoKCQl0ICs9IHNbaV07ICAKCQliYWNrdHJhY2soaSArIDEsIHQpOyAgCgkJdC5wb3BfYmFjaygpOyAgCgl9CgoJdm9pZCBzb2x2ZSgpIHsKCQlzdHJpbmcgdCA9ICIiOyAKCQlhbnMgPSAwOyAgIAoJCQoJCWJhY2t0cmFjaygxLCB0KTsgCgoJCWNvdXQgPDwgYW5zIC0gMSA8PCAnXG4nOyAKCX0KfQoKbmFtZXNwYWNlIHN1YjIgewoJY29uc3QgaW50IE4gPSAxZTMgKyA1OyAgCgoJaW50IGRwW05dWzJdOyAvLyAwIGNo4bq1biwgMSBs4bq7IAoKCXZvaWQgc29sdmUoKSB7CgkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJCWRwW2ldWzFdID0gMTsgLy8geMOidSBjaOG7iSBjaOG7qWEgMSBrw60gdOG7sSBzW2ldICAKCgkJCWZvciAoaW50IHBhcml0eSA9IDA7IHBhcml0eSA8PSAxOyBwYXJpdHkrKykgewoJCQkJZm9yIChpbnQgaiA9IDE7IGogPCBpOyBqKyspIHsKCQkJCQlpZiAocGFyaXR5ID09IDAgJiYgc1tqXSA8IHNbaV0pIHsKCQkJCQkJYWRkKGRwW2ldW3Bhcml0eV0sIGRwW2pdW3Bhcml0eSBeIDFdKTsgCgkJCQkJfQkKCQkJCQkKCQkJCQlpZiAocGFyaXR5ID09IDEgJiYgc1tqXSA+IHNbaV0pIHsKCQkJCQkJYWRkKGRwW2ldW3Bhcml0eV0sIGRwW2pdW3Bhcml0eSBeIDFdKTsgCgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlpbnQgYW5zID0gMDsgICAKCQlmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQkJZm9yIChpbnQgcGFyaXR5ID0gMDsgcGFyaXR5IDw9IDE7IHBhcml0eSsrKSB7CgkJCQlhZGQoYW5zLCBkcFtpXVtwYXJpdHldKTsgCgkJCX0KCQl9CgoJCWNvdXQgPDwgYW5zIDw8ICdcbic7IAoJfQp9CgpuYW1lc3BhY2Ugc3ViMyB7Cgljb25zdCBpbnQgTiA9IDFlNiArIDU7ICAKCglpbnQgZHBbTl1bMl07IC8vIDAgY2jhurVuLCAxIGzhursgCglpbnQgc3VtWzJdWzI2XTsgIAoKCWludCBnZXRTdW0oaW50IHBhcml0eSwgaW50IGwsIGludCByKSB7CgkJaWYgKGwgPiByKSByZXR1cm4gMDsgIAoJCXJldHVybiBzdW1bcGFyaXR5XVtyXSAtICgobCA8PSAwKSA/IDAgOiBzdW1bcGFyaXR5XVtsIC0gMV0pOyAKCX0KCgl2b2lkIHNvbHZlKCkgewoJCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCQlkcFtpXVsxXSA9IDE7IC8vIHjDonUgY2jhu4kgY2jhu6lhIDEga8OtIHThu7Egc1tpXSAgCgoJCQlmb3IgKGludCBwYXJpdHkgPSAwOyBwYXJpdHkgPD0gMTsgcGFyaXR5KyspIHsKCQkJCWlmIChwYXJpdHkgPT0gMCkgewoJCQkJCWFkZChkcFtpXVswXSwgZ2V0U3VtKDEsIDAsIChzW2ldIC0gJ0EnKSAtIDEpKTsgCgkJCQl9CQoKCQkJCWlmIChwYXJpdHkgPT0gMSkgewoJCQkJCWFkZChkcFtpXVsxXSwgZ2V0U3VtKDAsIChzW2ldIC0gJ0EnKSArIDEsIDI1KSk7IAoJCQkJfQoJCQl9CgoJCQlmb3IgKGludCBwYXJpdHkgPSAwOyBwYXJpdHkgPD0gMTsgcGFyaXR5KyspIHsKCQkJCWZvciAoaW50IGMgPSAoc1tpXSAtICdBJyk7IGMgPD0gMjU7IGMrKykgYWRkKHN1bVtwYXJpdHldW2NdLCBkcFtpXVtwYXJpdHldKTsgCgkJCX0KCQl9CQoKCQlpbnQgYW5zID0gMDsgICAKCQlmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQkJZm9yIChpbnQgcGFyaXR5ID0gMDsgcGFyaXR5IDw9IDE7IHBhcml0eSsrKSB7CgkJCQlhZGQoYW5zLCBkcFtpXVtwYXJpdHldKTsgCgkJCX0KCQl9CgoJCWNvdXQgPDwgYW5zIDw8ICdcbic7IAoJfQp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyAgCQoJY2luID4+IHM7ICAKCW4gPSBzLnNpemUoKTsgIAoJcyA9ICcgJyArIHM7ICAKCglpbnQgc3VidGFzayA9IHdoYXRfc3VidGFzaygpOyAKCglpZiAoc3VidGFzayA9PSAxKSBzdWIxOjpzb2x2ZSgpOyAKCWlmIChzdWJ0YXNrID09IDIpIHN1YjI6OnNvbHZlKCk7IAoJaWYgKHN1YnRhc2sgPT0gMykgc3ViMzo6c29sdmUoKTsgCn0K