#include using namespace std; vector lines; const int numtimes = 1000000000; inline vector> hashlines() { vector> ret; for (auto& row : lines) { vector retl; for (unsigned int c = 0; c < row.size(); c++) { if (row[c] == 'O') { retl.push_back(c); } } ret.push_back(retl); } return ret; } int main() { ios::sync_with_stdio(0); cin.tie(0); string line; while (getline(cin, line) && !line.empty()) { lines.push_back(line); } vector>> all; for (unsigned int i = 0; i < numtimes; i++) { for (unsigned int r = 0; r < lines.size(); r++) { for (unsigned int c = 0; c < lines[r].size(); c++) { if (lines[r][c] == 'O') { lines[r][c] = '.'; unsigned int rr = r; while (rr != 0 && lines[rr - 1][c] == '.') { rr--; } lines[rr][c] = 'O'; } } } for (auto& row : lines) { for (unsigned int c = 0; c < row.size(); c++) { if (row[c] == 'O') { row[c] = '.'; unsigned int cc = c; while (cc != 0 && row[cc - 1] == '.') { cc--; } row[cc] = 'O'; } } } for (unsigned int r = lines.size() - 1; (int)r >= 0; r--) { for (unsigned int c = 0; c < lines[r].size(); c++) { if (lines[r][c] == 'O') { lines[r][c] = '.'; unsigned int rr = r; while (rr != lines.size() - 1 && lines[rr + 1][c] == '.') { rr++; } lines[rr][c] = 'O'; } } } for (auto& row : lines) { for (unsigned int c = row.size() - 1; (int)c >= 0; c--) { if (row[c] == 'O') { row[c] = '.'; unsigned int cc = c; while (cc != row.size() - 1 && row[cc + 1] == '.') { cc++; } row[cc] = 'O'; } } } const auto& hashed = hashlines(); for (unsigned int j = 0; j < i; j++) { if (all[j] == hashed) { unsigned int diff = i - j; all.push_back(all[(numtimes - j - 1) % diff + j]); goto mainexit; } } all.push_back(hashed); } mainexit: auto& lastver = all.back(); int ret = 0; for (unsigned int r = 0; r < lastver.size(); r++) { ret += (lastver.size() - r) * lastver[r].size(); } cout << ret << '\n'; }