func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, pd[4][10100], x, y, gox[4] = {1, 0, -1, 0}, goy[4] = {0, 1, 0, -1},                              w[16], dp[10100][8], mo = 1000000007;   char getin() {     char ch = getchar();     while (ch !=  .  && ch !=  X  && ch !=  O ) ch = getchar();     return ch;   }   int check(int k1, int k2, int k3) {     for (int i = 0; i < 3; i++) {       if (pd[i + 1][k1]) {         if (k2 & (1 << i)) return 0;       }       if (pd[i + 1][k1 - 1]) {         if (k3 & (1 << i))           return 0;         else           k3 += (1 << i);       }     }     int a[3] = {0};     for (int i = 0; i < 3; i++)       if ((k3 & (1 << i)) == 0) a[i]--;     for (int i = 0; i < 3; i++)       if (k2 & (1 << i)) a[i]++;     for (int i = 0; i < 3; i++)       if (a[i] < 0) return 0;     for (int i = 0; i < 2; i++)       if (a[i] && a[i + 1] == 0)         return 0;       else if (a[i])         a[i + 1] = 0;     if (a[2]) return 0;     return 1;   }   int solve(int k) {     memset(dp, 0x00, sizeof dp);     dp[0][7] = 1;     for (int i = 1; i <= n; i++)       for (int j = 0; j < 8; j++)         for (int k = 0; k < 8; k++)           if (check(i, j, k)) dp[i][j] = (dp[i][j] + dp[i - 1][k]) % mo;     int k1 = 0;     for (int i = 0; i < 3; i++)       if (pd[i + 1][n]) k1 += (1 << i);     return dp[n][7 ^ k1];   }   int dfs(int k1, int k2) {     if (k1 == 4) return w[k2] * solve(k2);     int flag = 0;     for (int i = 1; i <= 2; i++) {       int k3 = x + gox[k1] * i, k4 = y + goy[k1] * i;       if (k3 <= 0 || k3 > 3 || k4 <= 0 || k4 > n || pd[k3][k4]) {         flag = 1;         break;       }     }     int ans = 0;     if (flag == 0) {       for (int i = 1; i <= 2; i++) {         int k3 = x + gox[k1] * i, k4 = y + goy[k1] * i;         pd[k3][k4] = 1;       }       ans += dfs(k1 + 1, k2 + (1 << k1));       for (int i = 1; i <= 2; i++) {         int k3 = x + gox[k1] * i, k4 = y + goy[k1] * i;         pd[k3][k4] = 0;       }     }     ans = (ans + dfs(k1 + 1, k2)) % mo;     return ans;   }   int main() {     scanf( %d , &n);     for (int i = 1; i <= 3; i++)       for (int j = 1; j <= n; j++) {         char ch = getin();         if (ch ==  X )           pd[i][j] = 1;         else if (ch ==  O ) {           pd[i][j] = 2;           x = i;           y = j;         }       }     for (int i = 1; i < 16; i++) {       w[i] = 1;       for (int j = (i - 1) & i; j; j = (j - 1) & i) w[i] = w[i] - w[j];     }     cout << (dfs(0, 0) + mo) % mo << endl;     return 0;   }   