#include #include #include #include #define MAX_SIDE 447 #define MIN_SIDE 3 #define BLUE 'X' #define RED 'O' using namespace std; struct patio_layout { int side, inner, outer, sum; explicit patio_layout (int side_) : side(side_), outer((side_-1)*4), inner((side_-2)*(side_-2)), sum(inner + outer) {} }; int main() { vector patio_sizes; for (int i = MIN_SIDE; i <= MAX_SIDE; ++i) { patio_sizes.emplace_back(i); } int n; cin >> n; vector prefix_blue; vector prefix_red; prefix_blue.push_back(0); prefix_red.push_back(0); string s; getline(cin, s); for (int i = 0; i < n; ++i) { char c; cin >> c; prefix_blue.push_back(prefix_blue[i]); prefix_red.push_back(prefix_red[i]); if (c == BLUE) { prefix_blue[i+1]++; } else { prefix_red[i+1]++; } } long long cnt = 0; for (int i = 0; i <= n; ++i) { for (auto & size : patio_sizes) { if (i + size.sum > n) break; int blue = prefix_blue[i+size.sum] - prefix_blue[i]; int red = prefix_red[i+size.sum] - prefix_red[i]; if ((blue == size.inner && red == size.outer) || (red == size.inner && blue == size.outer)) { cnt++; } } } std::cout << cnt << std::endl; return 0; }