Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <iostream>
- using namespace std;
- const int kMod = 1e9 + 7;
- class Task {
- public:
- void solve() {
- read_input();
- print_output(get_result());
- }
- private:
- int n;
- string expr;
- void read_input() {
- ifstream fin("in");
- fin >> n >> expr;
- expr = " " + expr; // adaugare caracter fictiv - indexare de la 1
- fin.close();
- }
- int get_result() {
- /*
- Calculati numarul de parantezari ale expresiei date astfel incat
- rezultatul sa dea true si returnati restul impartirii numarului
- la 10^9 + 7.
- */
- string op, oper;
- int i;
- int F[n][n], T[n][n], Total[n][n], j;
- for(int i = 1; i <= n; ++i)
- {
- if(expr[i] == '&' || expr[i] == '|' || expr[i] == '^') op += expr[i];
- }
- for(int i = 1; i <= n; ++i)
- {
- if(expr[i] == 'T' || expr[i] == 'F')
- oper += expr[i];
- }
- for(int i = 1; i <= oper.size(); ++i)
- {
- for(int j = 1; j <= oper.size(); ++j)
- {
- T[i][j] = 0;
- F[i][j] = 0;
- Total[i][j] = 0;
- }
- }
- for (int i = 0; i < oper.size(); i++)
- {
- if (oper[i] == 'T')
- {
- T[i + 1][i + 1] = 1;
- F[i + 1][i + 1] = 0;
- }
- else
- {
- T[i + 1][i + 1] = 0;
- F[i + 1][i + 1] = 1;
- }
- Total[i + 1][i + 1] = 1;
- }
- cout<<op<<endl;
- for(int len = 1; len <= op.size(); ++len){
- for(int i = 1; i <= oper.size(); ++i)
- {
- for(int j = 1; j <= oper.size(); ++j)
- printf("%d ", T[i][j]);
- printf("\n");
- }
- /*for(int i = 1; i <= oper.size(); ++i)
- {
- for(int j = 1; j <= oper.size(); ++j)
- printf("%d ", F[i][j]);
- printf("\n");
- }*/
- printf("\n");
- for(int i = 1; i <= oper.size() - len + 1; ++i)
- {
- j = oper.size() - len + 1;
- for(int k = i; k < j; ++k)
- {
- if(op[k - 1] == '&')
- {
- T[i][j] += T[i][k] * T[k + 1][j];
- F[i][j] += Total[i][k] * Total[k + 1][j] - T[i][k] * T[k + 1][j];
- }
- else if(op[k - 1] == '|')
- {
- T[i][j] += Total[i][k] * Total[k + 1][j] - F[i][k] * F[k + 1][j];
- F[i][j] += F[i][k] * F[k + 1][j];
- 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]);
- }
- else if(op[k - 1] == '^')
- {
- T[i][j] += T[i][k] * F[k + 1][j] + F[i][k] * T[k + 1][j];
- F[i][j] += F[i][k] * F[k + 1][j] + T[i][k] * T[k + 1][j];
- }
- Total[i][j] = T[i][j] + F[i][j];
- }
- }
- }
- return T[1][oper.size()];
- }
- void print_output(int result) {
- ofstream fout("out");
- fout << result << '\n';
- fout.close();
- }
- };
- int main() {
- Task task;
- task.solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement