func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 152;   const int maxp = 51123987;   static int A[maxn], len;   static int opt[maxn][52][52][52], n, Ne[maxn][4];   char s[maxn];   static int idx[maxn * 10];   int main() {     scanf( %d n , &n);     for (int i = 1; i <= n; i++) {       s[++len] = getchar();       if (s[len] == s[len - 1]) len--;     }     for (int i = len; i; i--) {       int kd = s[i] ==  a ;       if (s[i] ==  b ) kd = 2;       if (s[i] ==  c ) kd = 3;       Ne[i][1] = Ne[i + 1][1];       Ne[i][2] = Ne[i + 1][2];       Ne[i][3] = Ne[i + 1][3];       Ne[i][kd] = i;     }     int mxl = (n - 1) / 3 + 1;     opt[Ne[1][1]][1][0][0] = 1;     opt[Ne[1][2]][0][1][0] = 1;     opt[Ne[1][3]][0][0][1] = 1;     for (int i = 1; i <= len; i++)       for (int j = 0; j <= mxl; j++)         for (int k = 0; k <= mxl; k++)           for (int l = 0; l <= mxl; l++) {             opt[Ne[i][1]][j + 1][k][l] =                 opt[Ne[i][1]][j + 1][k][l] + opt[i][j][k][l];             if (opt[Ne[i][1]][j + 1][k][l] >= maxp)               opt[Ne[i][1]][j + 1][k][l] -= maxp;             opt[Ne[i][2]][j][k + 1][l] =                 opt[Ne[i][2]][j][k + 1][l] + opt[i][j][k][l];             if (opt[Ne[i][2]][j][k + 1][l] >= maxp)               opt[Ne[i][2]][j][k + 1][l] -= maxp;             opt[Ne[i][3]][j][k][l + 1] =                 opt[Ne[i][3]][j][k][l + 1] + opt[i][j][k][l];             if (opt[Ne[i][3]][j][k][l + 1] >= maxp)               opt[Ne[i][3]][j][k][l + 1] -= maxp;           }     int ans = 0;     for (int i = 1; i <= len; i++) {       if (n % 3 == 0) ans = (ans + opt[i][mxl][mxl][mxl]) % maxp;       if (n % 3 == 1)         ans = (ans + opt[i][mxl - 1][mxl - 1][mxl] +                opt[i][mxl - 1][mxl][mxl - 1] + opt[i][mxl][mxl - 1][mxl - 1]) %               maxp;       if (n % 3 == 2)         ans = (ans + opt[i][mxl][mxl - 1][mxl] + opt[i][mxl - 1][mxl][mxl] +                opt[i][mxl][mxl][mxl - 1]) %               maxp;     }     printf( %d n , ans);     return 0;   }   