func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long M = 51123987;   long long C[151][151];   int dp[2][3][51][51][51] = {};   int main() {     int n;     string s;     cin >> n >> s;     auto cur = dp[0];     auto nex = dp[1];     int u = (n - 1) / 3 + 1;     int t[3] = {};     for (int i = 0; i < n; i++) {       memset(nex, 0, sizeof(dp) / 2);       t[s[i] -  a ]++;       for (int j = 0; j < 3; j++) {         bool col = s[i] -  a  == j;         int c[3];         for (c[0] = 0; c[0] <= t[0] && c[0] <= u; c[0]++) {           for (c[1] = 0; c[1] <= t[1] && c[1] <= u; c[1]++) {             for (c[2] = 0; c[2] <= t[2] && c[2] <= u; c[2]++) {               long long v = 0;               if (col) {                 if (c[j]) {                   if (c[0] + c[1] + c[2] == 1) {                     v = 1;                   }                   int p[3] = {c[0], c[1], c[2]};                   p[j]--;                   for (int k = 1; k <= 2; k++) {                     v += cur[(j + k) % 3][p[0]][p[1]][p[2]];                     v %= M;                   }                 }               } else {                 v = cur[j][c[0]][c[1]][c[2]];               }               nex[j][c[0]][c[1]][c[2]] = v;             }           }         }       }       swap(nex, cur);     }     for (int i = 0; i <= u; i++) {       C[i][0] = 1;       for (int j = 1; j <= i; j++) {         C[i][j] = C[i - 1][j - 1] + C[i - 1][j];         C[i][j] %= M;       }     }     long long ret = 0;     for (int i = max(0, u - 1); i <= u; i++) {       for (int j = max(0, u - 1); j <= u; j++) {         for (int k = max(0, u - 1); k <= u; k++) {           if (i + j + k != n) continue;           for (int p = min(i, 1); p <= i; p++) {             for (int q = min(j, 1); q <= j; q++) {               for (int r = min(k, 1); r <= k; r++) {                 long long s = 0;                 for (int v = 0; v < 3; v++) {                   s += cur[v][p][q][r];                   s %= M;                 }                 if (i != p) {                   s *= C[i - 1][p - 1];                   s %= M;                 }                 if (j != q) {                   s *= C[j - 1][q - 1];                   s %= M;                 }                 if (k != r) {                   s *= C[k - 1][r - 1];                   s %= M;                 }                 ret += s;                 ret %= M;               }             }           }         }       }     }     cout << ret << endl;     return 0;   }   