Guest User

Untitled

a guest
Jul 17th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. #include<cstdio>
  2. #include<cstring>
  3.  
  4. using namespace std;
  5.  
  6. const int MOD=100000;
  7. struct mint {
  8. int x;
  9. mint(int x_=0) : x(x_%MOD) { }
  10. mint operator+(const mint& o) { return x+o.x; }
  11. void operator+=(const mint& o) { x=(x+o.x)%MOD; }
  12. };
  13.  
  14. mint dp[2][1<<20][2];
  15. char F[24][24];
  16.  
  17. #define ok(x,y,c) (F[y][x]==c || F[y][x]=='?')
  18.  
  19. int main()
  20. {
  21. int N, M;
  22. scanf("%d%d", &N, &M);
  23. for(int i=0; i<N; ++i) scanf("%s", F[i]);
  24. if(ok(0,0,'J')) dp[0][0][1]+=1;
  25. if(ok(0,0,'O')) dp[0][0][0]+=1;
  26. if(ok(0,0,'I')) dp[0][0][0]+=1;
  27. int p=1, q=0;
  28. for(int y=0; y<N; ++y) {
  29. if(y > 0) memset(dp[p],0,sizeof(dp[p]));
  30. int high = 1<<(M-1);
  31. if(y > 0) {
  32. for(int m=0; m<(1<<M); ++m) {
  33. if(ok(0,y,'J')) dp[p][(m&~high)>>1][1]+=dp[q][m][0]+dp[q][m][1];
  34. if(ok(0,y,'O')) dp[p][(m&~high)>>1][0]+=dp[q][m][0]+dp[q][m][1];
  35. if(ok(0,y,'I') && (m&1)==0) dp[p][(m&~high)>>1][0]+=dp[q][m][0]+dp[q][m][1];
  36. }
  37. p=1-p; q=1-q;
  38. }
  39. for(int x=1; x<M; ++x) {
  40. memset(dp[p],0,sizeof(dp[p]));
  41. for(int m=0; m<(1<<M); ++m) {
  42. if(ok(x,y,'J')) {
  43. dp[p][(m&~high)>>1][1]+=dp[q][m][0]+dp[q][m][1];
  44. }
  45. if(ok(x,y,'O')) {
  46. dp[p][(m&~high)>>1][0]+=dp[q][m][0];
  47. dp[p][(m|high)>>1][0]+=dp[q][m][1];
  48. }
  49. if(ok(x,y,'I') && (m&1)==0) {
  50. dp[p][(m&~high)>>1][0]+=dp[q][m][0]+dp[q][m][1];
  51. }
  52. }
  53. p=1-p; q=1-q;
  54. }
  55. }
  56. int sol=1;
  57. for(int i=0; i<N; ++i)
  58. for(int j=0; j<M; ++j)
  59. if(F[i][j]=='?') sol=(sol*3)%MOD;
  60. for(int i=0; i<(1<<M); ++i)
  61. sol = (sol-dp[q][i][0].x-dp[q][i][1].x+2*MOD)%MOD;
  62. printf("%d\n", sol);
  63. return 0;
  64. }
Add Comment
Please, Sign In to add comment