D - RGB Triplets
題意:
要求你找到三元的組合。有兩個條件
- 每個三元組合由R ,G ,B構成
- i,j,k不能成等差。
思路:
- 因爲每個三元組裏的元素沒要求,所以組合數學中的乘法原理即可。
- 之後再枚舉排除不滿足的情況(i,j,k等差情況)
反思
- 位運算的優先級巨低,(要加括號)
AC
#include <iostream>
#include <cstring>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
#define foR(i,x,y) for(register int i=(x); i>=(y); i--)
using namespace std;
const int maxn=4e3+10;
typedef long long ll;
char s[maxn];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n;
cin>>n;
cin>>s+1;
ll cnt1,cnt2,cnt3,ans=0;
cnt1=cnt2=cnt3=0;
For(i,1,n)
{
if(s[i]=='R')cnt1++;
else if(s[i]=='G')cnt2++;
else cnt3++;
}
ans=cnt1*cnt2*cnt3;
For(i,1,n)
{
for(int j=1; i+j+j<=n; j++)
{
if((s[i]^s[i+j]^s[i+j*2])==('R'^'G'^'B'))ans--;
}
}
cout<<ans<<endl;
return 0;
}