4.(A组,B组)
题目:
代码:
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]存储不同字母出现的次数
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 vvVB0!