Files
Data-Structure/Algorithm/DP-DynamicProgramming/Linear-DP/P12143 [蓝桥杯 2025 省 A] 好串的数目.cpp
2025-09-21 12:21:50 +08:00

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;
}