#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;
const int N = 5e5 + 5;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
int n;
string s;
int nxt[N][26]; // nxt[i][c] = Vị trí i' gần nhất > i sao cho s[i'] = c
void precompute() {
for (int c = 0; c <= 25; c++) nxt[n][c] = n + 1;
for (int i = n - 1; i >= 0; i--) {
for (int c = 0; c <= 25; c++) nxt[i][c] = nxt[i + 1][c];
nxt[i][s[i + 1] - 'a'] = i + 1;
}
}
int dp[N]; // dp[i] = Số xâu con phân biệt kết thúc tại vị trí i
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> s;
n = s.size();
s = ' ' + s;
precompute();
dp[0] = 1;
for (int i = 0; i < n; i++) {
for (int c = 0; c <= 25; c++) {
add(dp[nxt[i][c]], dp[i]);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) add(ans, dp[i]);
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7IApjb25zdCBpbnQgTiA9IDVlNSArIDU7IAoKdm9pZCBhZGQoaW50JiBhLCBpbnQgYikgewoJYSArPSBiOyAKCWlmIChhID49IE1PRCkgYSAtPSBNT0Q7IAp9CgppbnQgbjsgCnN0cmluZyBzOyAKCmludCBueHRbTl1bMjZdOyAvLyBueHRbaV1bY10gPSBW4buLIHRyw60gaScgZ+G6p24gbmjhuqV0ID4gaSBzYW8gY2hvIHNbaSddID0gYyAKCnZvaWQgcHJlY29tcHV0ZSgpIHsKCWZvciAoaW50IGMgPSAwOyBjIDw9IDI1OyBjKyspIG54dFtuXVtjXSA9IG4gKyAxOyAKCglmb3IgKGludCBpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJZm9yIChpbnQgYyA9IDA7IGMgPD0gMjU7IGMrKykgbnh0W2ldW2NdID0gbnh0W2kgKyAxXVtjXTsKCQlueHRbaV1bc1tpICsgMV0gLSAnYSddID0gaSArIDE7IAoJfQp9CgppbnQgZHBbTl07IC8vIGRwW2ldID0gU+G7kSB4w6J1IGNvbiBwaMOibiBiaeG7h3Qga+G6v3QgdGjDumMgdOG6oWkgduG7iyB0csOtIGkKCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBzOyAKCW4gPSBzLnNpemUoKTsgIAoJcyA9ICcgJyArIHM7ICAKCglwcmVjb21wdXRlKCk7ICAgCgoJZHBbMF0gPSAxOyAgCglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewoJCWZvciAoaW50IGMgPSAwOyBjIDw9IDI1OyBjKyspIHsKCQkJYWRkKGRwW254dFtpXVtjXV0sIGRwW2ldKTsgCgkJfQoJfQoKCWludCBhbnMgPSAwOyAgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGFkZChhbnMsIGRwW2ldKTsgCgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0=