#include <bits/stdc++.h>
using namespace std;
struct node {
int lG, lH;
int rG, rH;
} cow[500010];
char s[500010];
long long ans;
void ready_() { // 预处理
int num_G = 0, num_H = 0, i, len = strlen(s);
for (i = 0; i < len; i++) {
cow[i].lH = num_H;
cow[i].lG = num_G;
if (s[i] == 'G') num_G++, num_H = 0;
else num_H++, num_G = 0;
}
num_G = num_H = 0;
for (i = len - 1; i >= 0; i--) {
cow[i].rH = num_H;
cow[i].rG = num_G;
if (s[i] == 'G') num_G++, num_H = 0;
else num_H++, num_G = 0;
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("P7993_11.in", "r", stdin);
#endif
int n, i;
scanf("%d%s", &n, s);
ready_();
for (i = 0; i < int(strlen(s)); i++) {
if (s[i] == 'G') {
ans += cow[i].lH * cow[i].rH + cow[i].lH + cow[i].rH - 2;
ans = ans + (!cow[i].lH) + (!cow[i].rH);
} else {
ans += cow[i].lG * cow[i].rG + cow[i].lG + cow[i].rG - 2;
ans = ans + (!cow[i].lG) + (!cow[i].rG);
}
}
printf("%lld", ans);
}
蒟蒻觉得时间复杂度没问题啊,求助