#include using namespace std; bool evaluate( const size_t & redCount, const size_t & blueCount ){ if( blueCount < redCount ){ double temp = sqrt( blueCount ); if( floor( temp ) != temp ){ return false; } return true; } else{ double temp = sqrt( redCount ); if( floor( temp ) != temp){ return false; } return true; } } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); vector tiles; size_t n; cin >> n; char temp; size_t blueTiles = 0; size_t redTiles = 0; size_t res = 0; while(n--){ cin >> temp; if( temp == 'X'){ blueTiles++; tiles.emplace_back(true); } else{ redTiles++; tiles.emplace_back(false); } } size_t patioTileCountMax; if( blueTiles < redTiles ){ patioTileCountMax = floor( sqrt( blueTiles ) ); } else{ patioTileCountMax = floor( sqrt( redTiles ) ); } patioTileCountMax += 2; size_t patioSide = patioTileCountMax; patioTileCountMax = pow( patioTileCountMax, 2); size_t blueCount = 0; size_t redCount = 0; while( patioSide >= 3 ){ patioTileCountMax = pow( patioSide, 2); // cout << patioTileCountMax << endl; if( tiles.size() < patioTileCountMax ){ // cout << "skipped" << endl; patioSide--; continue; } size_t i = 0; for( ; i < patioTileCountMax; i++){ if( tiles[ i ] == 0 ){ blueCount++; } else{ redCount++; } } if( evaluate(redCount, blueCount ) ) res++; i = 1; while( i + patioTileCountMax - 1 < tiles.size() ){ i++; if( tiles[ i + patioTileCountMax - 1 ] == true ){ blueCount++; } else{ redCount++; } if( tiles[i - 1] == false ){ blueCount--; } else{ redCount--; } if( evaluate(redCount, blueCount ) ) res++; } patioSide--; } cout << res << endl; return 0; }