RGB问题
用到的知识点:思维
题目链接:https://vjudge.net/contest/374708#problem/E
思路:直接统计答案不太好统计,我们可以逆着想,我们先算满足第一个条件的个数,第一个条件很好求可以用dp,前缀和记录都可以,我们求出来第一个条件后肯定是有一些数是不满足第二个条件的,于是我们把不满足第二个条件的个数给删去就行了,第二个条件移项就是2j不等于i+k,于是n^2查找即可。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int len;
string s;
cin>>len>>s;
ll cnt1=0,cnt2=0,cnt3=0,sum=0;
for(int i=0;i<len;i++){//第一个条件
if(s[i]=='R') sum+=cnt2*cnt3,cnt1++;
if(s[i]=='G') sum+=cnt1*cnt3,cnt2++;
if(s[i]=='B') sum+=cnt1*cnt2,cnt3++;
}
for(int i=0;i<len;i++)
for(int j=i;j<len;j+=2)
if(s[i]!=s[j]&&s[i]!=s[(i+j)/2]&&s[j]!=s[(i+j)/2]) sum--;//第二个条件
printf("%lld\n",sum);
}