思路:
因为领导者要满足其中之一,
- 名单中包含其品种的所有奶牛。
- 名单中包含另一品种的领导者。
对于条件1--包含其品种的所有奶牛:意味着这头奶牛i必须是该品种的第一头(排在最前面的),且E[i]>=最后一头奶牛。这个好判断,我们只需记录每个品种的第一头奶牛和最后一头奶牛的下标,再判断是否E[FH] >= LH即可;
对于条件2--名单中包含另一品种的领导者:这个不好直接判断,只能先计算出另一品种奶牛领导者的下标才能计算的处理,所以我们考虑, 每一头H奶牛是否包含了G品种领导者奶牛
最后答案是两品种领导者数量的组合,即ans=cntG*cntH
int n;
char s[N];
int E[N];
void solve()
{
cin >> n;
int FH = 0,FG = 0,LH = 0,LG = 0;//第一头H奶牛的下标,第一头G奶牛的下标,最后一头H奶牛的下标,最后一头G奶牛的下标
for (int i = 1;i <= n;i ++)
{
cin >> s[i];
if (!FH && s[i] == 'H') FH = i;
if (!FG && s[i] == 'G') FG = i;
if (s[i] == 'H') LH = i;
if (s[i] == 'G') LG = i;
}
for (int i = 1;i <= n;i ++) cin >> E[i];
//条件1
LL cntG = 0,cntH = 0;
int idG = 0,idH = 0;
if (E[FH] >= LH) cntH++,idH = FH;
if (E[FG] >= LG) cntG++,idG = FG;
//条件2
if (idG)//如果G品种有领导者
{
for (int i = 1;i <= n;i ++)//是H奶牛,且包含G奶牛领导者,且不是H奶牛的领导者(避免重复计算)
if (s[i] == 'H' && (E[i] >= idG && i <= idG) && i != idH) cntH ++;
}
if (idH)//同理
{
for (int i = 1;i <= n;i ++)
if (s[i] == 'G' && (E[i] >= idH && i <= idH) && i != idG) cntG ++;
}
cout << cntH * cntG << endl;
}