32 lines
692 B
C++
32 lines
692 B
C++
#include <iostream>
|
|
#include <vector>
|
|
#include <string>
|
|
using namespace std;
|
|
int main(){
|
|
ios::sync_with_stdio(false);
|
|
cin.tie(nullptr);
|
|
|
|
string s;
|
|
cin >> s;
|
|
int n = s.size();
|
|
vector<int> dp(n, 1);
|
|
//dp[i]: 以i结尾的最长上升字符串
|
|
//上升字符串的子串必然是上升字符串
|
|
//预处理
|
|
for(int i = 1; i < n; i++){
|
|
if(s[i] == s[i - 1] + 1 || s[i] == s[i - 1]){
|
|
dp[i] = dp[i - 1] + 1;
|
|
}
|
|
}
|
|
//不需要容斥,怎么分都可以
|
|
int sum = 0;
|
|
for(int i = 0; i < n; i++){
|
|
//自己的
|
|
sum += (dp[i] - 1) * dp[i] / 2;
|
|
//前面一个区块的
|
|
sum += dp[i] * (i - dp[i]);
|
|
}
|
|
cout << sum << endl;
|
|
return 0;
|
|
}
|