#include<bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 +7;
const int maxn = 1e6 +5;
bool u[maxn];
long long fun(string t){
long long ans = 0;
map <char, int> m;
for(int i=0; i<t.size(); i++){
m[t[i]]++;
}
for(auto x: m){
if(x.second==1){
ans++;
}
}
return ans%MOD;
}
long long f(string s){
long long ans = s.size();
string t;
for(int i=0; i<s.size(); i++){
for(int j=i+1; j<s.size(); j++){
t = s.substr(i, (j-i)+1);
//cout<<t<<" "<<fun(t)<<'\n';
ans += fun(t);
}
}
return ans%MOD;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string s;
cin>>s;
int n = s.size();
set <char> st;
char c1, c2;
bool c = true;
bool T1 = true;
int id1 = 0;
int id2 = 0;
map <char, int> m;
int cnt = 0;
string T;
for(int i=0; i<s.size(); i++){
st.insert(s[i]);
if(s[i]!=s[i+1] && i!=s.size()-1){
c1 = s[i];
c2 = s[i+1];
id1 = i;
id2 = i+1;
cnt++;
//cout<<s[i]<<" "<<s[i+1]<<'\n';
}
m[s[i]]++;
if(u[s[i]]){
T1 = false;
}
else if(T1){
T+=s[i];
}
u[s[i]] = 1;
}
//cout<<T<<"\n";
//cout<<cnt<<"\n";
if(m.size()==T.size()){
int VAL = T.size();
cout<<(VAL * (n - VAL +1))*(VAL);
//cout<<"ok";
return 0;
}
if(st.size()==1){
cout<<s.size();
return 0;
}
if(st.size()==2 && cnt==1){
cout<<s.size() * 2;
return 0;
}
cout<<f(s);
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgbG9uZyBsb25nIE1PRCA9IDFlOSArNzsKY29uc3QgaW50IG1heG4gPSAxZTYgKzU7CmJvb2wgdVttYXhuXTsKCmxvbmcgbG9uZyBmdW4oc3RyaW5nIHQpewoJCglsb25nIGxvbmcgYW5zID0gMDsKCQoJbWFwIDxjaGFyLCBpbnQ+IG07CgkKCWZvcihpbnQgaT0wOyBpPHQuc2l6ZSgpOyBpKyspewoJCW1bdFtpXV0rKzsKCX0KCQoJZm9yKGF1dG8geDogbSl7CgkgICAgaWYoeC5zZWNvbmQ9PTEpewoJICAgICAgICBhbnMrKzsKCSAgICB9Cgl9CgkKCXJldHVybiBhbnMlTU9EOwp9CiAKbG9uZyBsb25nIGYoc3RyaW5nIHMpewoJbG9uZyBsb25nIGFucyA9IHMuc2l6ZSgpOwoJCglzdHJpbmcgdDsKCQoJZm9yKGludCBpPTA7IGk8cy5zaXplKCk7IGkrKyl7CgkJZm9yKGludCBqPWkrMTsgajxzLnNpemUoKTsgaisrKXsKCQkJdCA9IHMuc3Vic3RyKGksIChqLWkpKzEpOwoJCQkvL2NvdXQ8PHQ8PCIgIjw8ZnVuKHQpPDwnXG4nOwoJCQlhbnMgKz0gZnVuKHQpOwoJCX0KCX0KCQoJcmV0dXJuIGFucyVNT0Q7Cn0KIAppbnQgbWFpbigpewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKCWNpbi50aWUoMCk7Cgljb3V0LnRpZSgwKTsKCQoJc3RyaW5nIHM7CgljaW4+PnM7CgkKCWludCBuID0gcy5zaXplKCk7CgkKCXNldCA8Y2hhcj4gc3Q7CgkKCWNoYXIgYzEsIGMyOwoJCglib29sIGMgPSB0cnVlOwoJYm9vbCBUMSA9IHRydWU7CiAKCWludCBpZDEgPSAwOwoJaW50IGlkMiA9IDA7CgkKCW1hcCA8Y2hhciwgaW50PiBtOwoJaW50IGNudCA9IDA7CgkKCXN0cmluZyBUOwoJCglmb3IoaW50IGk9MDsgaTxzLnNpemUoKTsgaSsrKXsKCQlzdC5pbnNlcnQoc1tpXSk7CgkJCgkJaWYoc1tpXSE9c1tpKzFdICYmIGkhPXMuc2l6ZSgpLTEpewoJCSAgICAgYzEgPSBzW2ldOwoJCSAgICAgYzIgPSBzW2krMV07CgkJICAgICAKCQkgICAgIGlkMSA9IGk7CgkJICAgICBpZDIgPSBpKzE7CgkJICAgICAKCQkgICAgIGNudCsrOwoJCSAgICAgLy9jb3V0PDxzW2ldPDwiICI8PHNbaSsxXTw8J1xuJzsKCQl9CgkJCgkJbVtzW2ldXSsrOwoJCQoJCWlmKHVbc1tpXV0pewoJCQlUMSA9IGZhbHNlOwoJCX0KCQllbHNlIGlmKFQxKXsKCQkJVCs9c1tpXTsKCQl9CgkJCgkJdVtzW2ldXSA9IDE7CgkJCgl9CgkKCS8vY291dDw8VDw8IlxuIjsKCS8vY291dDw8Y250PDwiXG4iOwoJaWYobS5zaXplKCk9PVQuc2l6ZSgpKXsKCSAgICBpbnQgVkFMID0gVC5zaXplKCk7CgkgICAgCgkgICAgY291dDw8KFZBTCAqIChuIC0gVkFMICsxKSkqKFZBTCk7CgkgICAgLy9jb3V0PDwib2siOwoJICAgIHJldHVybiAwOwoJfQoJCglpZihzdC5zaXplKCk9PTEpewoJCWNvdXQ8PHMuc2l6ZSgpOwoJCXJldHVybiAwOwoJfQoJCglpZihzdC5zaXplKCk9PTIgJiYgY250PT0xKXsKCSAgICBjb3V0PDxzLnNpemUoKSAqIDI7CgkgICAgcmV0dXJuIDA7Cgl9CgkKCWNvdXQ8PGYocyk7Cn0=