Language: C++

#include "stdio.h"

long long int dp[2][3][(1 << 20)];
long long int dp2[2][3][(1 << 20)];

char e[22][22];

int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i = 0; i < m; i++)
	{
		scanf("%s",e[i]);
	}
	for(int i = 0; i < 2; i++)
	{
		for(int ii = 0; ii < 3; ii++)
		{
			for(int iii = 0; iii < (1 << n); iii++)
			{
				dp[i][ii][iii] = 0;
			}
		}
	}
	int temp = (1 << n) - 1;
	int temp2 = (1 << (n - 2));
		
	switch(e[0][0])
	{
	case 'J':
		dp[0][0][0] = 1;
		break;
	case 'O':
		dp[0][1][0] = 1;
		break;
	case 'I':
		dp[0][2][0] = 1;
		break;
	case '?':
		dp[0][0][0] = 1;
		dp[0][1][0] = 1;
		dp[0][2][0] = 1;
		break;
	}
	for(int j = 1; j < n; j++)
	{
		for(int i = 0; i < 2; i++)
		{
			for(int ii = 0; ii < 3; ii++)
			{
				for(int iii = 0; iii < (1 << n); iii++)
				{
					dp2[i][ii][iii] = 0;
				}
			}
		}
		switch(e[0][i])
		{
		case 'J':
			for(int i = 0; i < (1 << n); i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					dp2[0][0][(i << 1) & temp] += dp[0][ii][i];
				}
			}
			break;
		case 'O':
			for(int i = 0; i < (1 << n); i++)
			{
				dp2[0][1][(i << 1) & temp + 1] += dp[0][0][i];
				dp2[0][1][(i << 1) & temp] += dp[0][1][i];
				dp2[0][1][(i << 1) & temp] += dp[0][2][i];
			}
			break;
		case 'I':
			for(int i = 0; i < (1 << n); i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					dp2[0][2][(i << 1) & temp] += dp[0][ii][i];
				}
			}
			break;
		case '?':
			for(int i = 0; i < (1 << n); i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					dp2[0][0][(i << 1) & temp] += dp[0][ii][i];
				}
			}
			for(int i = 0; i < (1 << n); i++)
			{
				dp2[0][1][(i << 1) & temp + 1] += dp[0][0][i];
				dp2[0][1][(i << 1) & temp] += dp[0][1][i];
				dp2[0][1][(i << 1) & temp] += dp[0][2][i];
			}
			for(int i = 0; i < (1 << n); i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					dp2[0][2][(i << 1) & temp] += dp[0][ii][i];
				}
			}
			break;
		}
		for(int i = 0; i < 2; i++)
		{
			for(int ii = 0; ii < 3; ii++)
			{
				for(int iii = 0; iii < (1 << n); iii++)
				{
					dp[i][ii][iii] = dp2[i][ii][iii] % 10000;
				}
			}
		}
	}
	
	for(int j = 1; i < m; j++)
	{
		for(int i = 0; i < 2; i++)
		{
			for(int ii = 0; ii < 3; ii++)
			{
				for(int iii = 0; iii < (1 << n); iii++)
				{
					dp2[i][ii][iii] = 0;
				}
			}
		}
		switch(e[j][0])
		{
		case 'J':
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][0][(iii << 1) & temp] += dp[i][ii][iii];
					}
				}
			}
			break;
		case 'O':
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][1][(iii << 1) & temp] += dp[i][ii][iii];
					}
				}
			}
			break;
		case 'I':
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						if((iii & temp2) != 0)
						{
							dp2[1][2][(iii << 1) & temp] += dp[i][ii][iii];
						}
						else
						{
							dp2[i][2][(iii << 1) & temp] += dp[i][ii][iii];
						}
					}
				}
			}
			break;
		case '?':
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][0][(iii << 1) & temp] += dp[i][ii][iii];
					}
				}
			}
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][1][(iii << 1) & temp] += dp[i][ii][iii];
					}
				}
			}
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						if((iii & temp2) != 0)
						{
							dp2[1][2][(iii << 1) & temp] += dp[i][ii][iii];
						}
						else
						{
							dp2[i][2][(iii << 1) & temp] += dp[i][ii][iii];
						}
					}
				}
			}
			break;
		}
		for(int i = 0; i < 2; i++)
		{
			for(int ii = 0; ii < 3; ii++)
			{
				for(int iii = 0; iii < (1 << n); iii++)
				{
					dp[i][ii][iii] = dp2[i][ii][iii] % 10000;
				}
			}
		}
		for(int jj = 1; jj < n - 1; jj++)
		{
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][ii][iii] = 0;
					}
				}
			}
			switch(e[j][jj])
			{
			case 'J':
				for(int i = 0; i < 2; i++)
				{
					for(int ii = 0; ii < 3; ii++)
					{
						for(int iii = 0; iii < (1 << n); iii++)
						{
							dp2[i][0][(iii << 1) & temp] += dp[i][ii][iii];
						}
					}
				}
				break;
			case 'O':
				for(int i = 0; i < 2; i++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][1][(iii << 1) & temp + 1] += dp[i][0][iii];
						dp2[i][1][(iii << 1) & temp] += dp[i][1][iii];
						dp2[i][1][(iii << 1) & temp] += dp[i][2][iii];
					}
				}
				break;
			case 'I':
				for(int i = 0; i < 2; i++)
				{
					for(int ii = 0; ii < 3; ii++)
					{
						for(int iii = 0; iii < (1 << n); iii++)
						{
							if((iii & temp2) != 0)
							{
								dp2[1][2][(iii << 1) & temp] += dp[i][ii][iii];
							}
							else
							{
								dp2[i][2][(iii << 1) & temp] += dp[i][ii][iii];
							}
						}
					}
				}
				break;
			case '?':
				for(int i = 0; i < 2; i++)
				{
					for(int ii = 0; ii < 3; ii++)
					{
						for(int iii = 0; iii < (1 << n); iii++)
						{
							dp2[i][0][(iii << 1) & temp] += dp[i][ii][iii];
						}
					}
				}
				for(int i = 0; i < 2; i++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][1][(iii << 1) & temp + 1] += dp[i][0][iii];
						dp2[i][1][(iii << 1) & temp] += dp[i][1][iii];
						dp2[i][1][(iii << 1) & temp] += dp[i][2][iii];
					}
				}
				for(int i = 0; i < 2; i++)
				{
					for(int ii = 0; ii < 3; ii++)
					{
						for(int iii = 0; iii < (1 << n); iii++)
						{
							if((iii & temp2) != 0)
							{
								dp2[1][2][(iii << 1) & temp] += dp[i][ii][iii];
							}
							else
							{
								dp2[i][2][(iii << 1) & temp] += dp[i][ii][iii];
							}
						}
					}
				}
				break;
			}
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp[i][ii][iii] = dp2[i][ii][iii] % 10000;
					}
				}
			}
		}
		for(int i = 0; i < 2; i++)
		{
			for(int ii = 0; ii < 3; ii++)
			{
				for(int iii = 0; iii < (1 << n); iii++)
				{
					dp2[i][ii][iii] = 0;
				}
			}
		}
		switch(e[j][n - 1])
		{
		case 'J':
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][0][(iii << 1) & temp] += dp[i][ii][iii];
					}
				}
			}
			break;
		case 'O':
			for(int i = 0; i < 2; i++)
			{
				for(int iii = 0; iii < (1 << n); iii++)
				{
					dp2[i][1][(iii << 1) & temp + 1] += dp[i][0][iii];
					dp2[i][1][(iii << 1) & temp] += dp[i][1][iii];
					dp2[i][1][(iii << 1) & temp] += dp[i][2][iii];
				}
			}
			break;
		case 'I':
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][2][(iii << 1) & temp] += dp[i][ii][iii];
					}
				}
			}
			break;
		case '?':
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][0][(iii << 1) & temp] += dp[i][ii][iii];
					}
				}
			}
			for(int i = 0; i < 2; i++)
			{
				for(int iii = 0; iii < (1 << n); iii++)
				{
					dp2[i][1][(iii << 1) & temp + 1] += dp[i][0][iii];
					dp2[i][1][(iii << 1) & temp] += dp[i][1][iii];
					dp2[i][1][(iii << 1) & temp] += dp[i][2][iii];
				}
			}
			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					for(int iii = 0; iii < (1 << n); iii++)
					{
						dp2[i][2][(iii << 1) & temp] += dp[i][ii][iii];
					}
				}
			}
			break;
		}
		for(int i = 0; i < 2; i++)
		{
			for(int ii = 0; ii < 3; ii++)
			{
				for(int iii = 0; iii < (1 << n); iii++)
				{
					dp[i][ii][iii] = dp2[i][ii][iii] % 10000;
				}
			}
		}
	}
	long long int all = 0;
	for(int ii = 0; ii < 3; ii++)
	{
		int(int iii = 0; iii < (1 << n); iii++)
		{
			all = (all + dp[1][ii][iii]) % 10000;
		}
	}
	printf("%lld\n",all);
	return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:58:29: error: 'i' was not declared in this scope
   58 |                 switch(e[0][i])
      |                             ^
a.cc:121:24: error: 'i' was not declared in this scope
  121 |         for(int j = 1; i < m; j++)
      |                        ^
a.cc:427:17: error: expected primary-expression before 'int'
  427 |                 int(int iii = 0; iii < (1 << n); iii++)
      |                 ^~~
a.cc:427:34: error: 'iii' was not declared in this scope; did you mean 'ii'?
  427 |                 int(int iii = 0; iii < (1 << n); iii++)
      |                                  ^~~
      |                                  ii