Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. const int kMod = 1e9 + 7;
  9.  
  10. class Task {
  11. public:
  12. void solve() {
  13. read_input();
  14. print_output(get_result());
  15. }
  16.  
  17. private:
  18. int n;
  19. string expr;
  20.  
  21. void read_input() {
  22. ifstream fin("in");
  23. fin >> n >> expr;
  24. expr = " " + expr; // adaugare caracter fictiv - indexare de la 1
  25. fin.close();
  26. }
  27.  
  28. int get_result() {
  29. /*
  30. Calculati numarul de parantezari ale expresiei date astfel incat
  31. rezultatul sa dea true si returnati restul impartirii numarului
  32. la 10^9 + 7.
  33. */
  34. string op, oper;
  35. int i;
  36. int F[n][n], T[n][n], Total[n][n], j;
  37.  
  38. for(int i = 1; i <= n; ++i)
  39. {
  40. if(expr[i] == '&' || expr[i] == '|' || expr[i] == '^') op += expr[i];
  41. }
  42. for(int i = 1; i <= n; ++i)
  43. {
  44. if(expr[i] == 'T' || expr[i] == 'F')
  45. oper += expr[i];
  46. }
  47.  
  48. for(int i = 1; i <= oper.size(); ++i)
  49. {
  50. for(int j = 1; j <= oper.size(); ++j)
  51. {
  52. T[i][j] = 0;
  53. F[i][j] = 0;
  54. Total[i][j] = 0;
  55. }
  56. }
  57. for (int i = 0; i < oper.size(); i++)
  58. {
  59. if (oper[i] == 'T')
  60. {
  61. T[i + 1][i + 1] = 1;
  62. F[i + 1][i + 1] = 0;
  63. }
  64. else
  65. {
  66. T[i + 1][i + 1] = 0;
  67. F[i + 1][i + 1] = 1;
  68. }
  69. Total[i + 1][i + 1] = 1;
  70. }
  71. cout<<op<<endl;
  72. for(int len = 1; len <= op.size(); ++len){
  73. for(int i = 1; i <= oper.size(); ++i)
  74. {
  75. for(int j = 1; j <= oper.size(); ++j)
  76. printf("%d ", T[i][j]);
  77. printf("\n");
  78. }
  79. /*for(int i = 1; i <= oper.size(); ++i)
  80. {
  81. for(int j = 1; j <= oper.size(); ++j)
  82. printf("%d ", F[i][j]);
  83. printf("\n");
  84. }*/
  85. printf("\n");
  86. for(int i = 1; i <= oper.size() - len + 1; ++i)
  87. {
  88. j = oper.size() - len + 1;
  89. for(int k = i; k < j; ++k)
  90. {
  91.  
  92. if(op[k - 1] == '&')
  93. {
  94. T[i][j] += T[i][k] * T[k + 1][j];
  95. F[i][j] += Total[i][k] * Total[k + 1][j] - T[i][k] * T[k + 1][j];
  96.  
  97. }
  98. else if(op[k - 1] == '|')
  99. {
  100. T[i][j] += Total[i][k] * Total[k + 1][j] - F[i][k] * F[k + 1][j];
  101. F[i][j] += F[i][k] * F[k + 1][j];
  102. if(i == 1 && j == 2) printf("OP:%c\n %d %d %d %d\n", op[k - 1], Total[i][k], Total[k + 1][j], F[i][k], F[k + 1][j]);
  103. }
  104. else if(op[k - 1] == '^')
  105. {
  106. T[i][j] += T[i][k] * F[k + 1][j] + F[i][k] * T[k + 1][j];
  107. F[i][j] += F[i][k] * F[k + 1][j] + T[i][k] * T[k + 1][j];
  108. }
  109. Total[i][j] = T[i][j] + F[i][j];
  110. }
  111. }
  112. }
  113. return T[1][oper.size()];
  114. }
  115.  
  116. void print_output(int result) {
  117. ofstream fout("out");
  118. fout << result << '\n';
  119. fout.close();
  120. }
  121. };
  122.  
  123. int main() {
  124. Task task;
  125. task.solve();
  126. return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement