题目:
alt text
代码:

include

include

using namespace std;

int main(){
long long n,result = 0;
string s;
cin>>n>>s;
int num[26] = {0},dp[26] = {0};
for(int i = 0; i < n;i++){
result = result + dp[s[i] - ‘a’];
dp[s[i] - ‘a’] += i - num[s[i] - ‘a’];
num[s[i] - ‘a’]++;
}
cout<<result;
return 0;
}
方法思想:动态规划
eg:abcbcc
判断“abb”式的大体思想是:第一个字符和第二个字符不同,第二个字符和第三个字符相同 == 每遍历一个字符“b”,判断在此之前有多少个“ab”
重难点:如何判断在此之前有多少个“ab”:用当前遍历的元素个数 - 该元素此前出现的次数 剩下的就是与该元素不同的元素,只要不同就能构成一个“ab”,能构成一个“ab”,该元素就能构成多少个“abb”
需要的变量:result存储结果,dp[26]存储构成的“ab”数量,num[26]存储不同字母出现的次数