思路:
假设第i个位置上为G,含这个G的孤独的照片此时有三种情况:
1.i-1为G,i后面有R(R>=2)个H,该情况有R-1张孤独的照片。
2.i+1为G,i前面有L(L>=2)个H,该情况L-1张孤独的照片。
3.i前面有L个H,i后面有R个H,该情况有L*R张孤独的照片。
所以,现在要求位置i前面有多少连续的H,后面有多少连续的H
用cnt_H和cnt_G计数,当碰到H时,记录此时前面G的数量,并将G的数量清零,H的数量加加。
AC代码:
#include<iostream>
using namespace std;
int main()
{
int n;
char ch[500005];
int l[500005];
int r[500005];
int cnt_H=0,cnt_G=0;
long long ans=0;
cin>>n;
cin>>ch;
for(int i=0;i<n;++i)
{
if(ch[i]=='G') l[i]=cnt_H,cnt_H=0,cnt_G++;
else l[i]=cnt_G,cnt_G=0,cnt_H++;
}
cnt_H=0,cnt_G=0;
for(int i=n-1;i>=0;i--)
{
if(ch[i]=='G') r[i]=cnt_H,cnt_H=0,cnt_G++;
else r[i]=cnt_G,cnt_G=0,cnt_H++;
}
for(int i=0;i<n;++i)
{
ans+=(long long)l[i]*r[i]+max(l[i]-1,0)+max(r[i]-1,0);
}
cout<<ans<<endl;
return 0;
}