本文主要是介绍Atcoder ABC162 D - RGB Triplets,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
D - RGB Triplets
链接:https://atcoder.jp/contests/abc162/tasks/abc162_d
题目大意:给你一个长度不超过4000的仅包含‘R’,‘G’,'B’的字符串,问满足Si, Sj, Sk(1<=i<j<k<=N)且j−i≠k−j互不相等有多少种情况
思路: 计算R,G,B分别有多少个,若直接暴力,肯定会超时,那么换个思路,满足j−i≠k−j的所有情况等于RGB减去不满足j-i ≠ k - j即 j - i = k - j,我们可以构造成j , i+j, 2 * i +j
代码:
#include <iostream>
using namespace std;int main()
{int N;string s;scanf("%d", &N);cin>>s;long long red, green, blue, result;red = green = blue = 0;for(int i = 0; i < s.size(); i++){if(s[i] == 'R')red++;if(s[i] == 'G')green++;if(s[i] == 'B')blue++;}result = red * green * blue;for(int i = 0; 2 * i < N; i++){for(int j = 0; 2 * i + j < N; j++){if(s[j] != s[i + j] && s[j] != s[2 * i + j] && s[i + j] != s[2 * i + j]){result--;}}}printf("%lld", result);return 0;
}
这篇关于Atcoder ABC162 D - RGB Triplets的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!