제출 #1161137

#제출 시각아이디문제언어결과실행 시간메모리
1161137GabrielSecurity Gate (JOI18_security_gate)C++20
12 / 100
5093 ms436 KiB
#include "bits/stdc++.h" using namespace std; long long n, m = 1000000007; string s; //vector< vector< vector< vector<long long> > > > Memorizaci_n; long long Suma(long long a, long long b){ return (a % m + b % m) % m; } /*long long Resolver(long long i, long long p, long long Invertido, long long Usado){ if(p < 0 or p >= n + 2) return 0; if(i == n and p == 0 and Invertido == 0) return 1; if(i == n and (p != 0 or Invertido != 0)) return 0; if(Memorizaci_n[i][p][Invertido][Usado] != -2) return Memorizaci_n[i][p][Invertido][Usado] % m; long long Retorno = 0; if(s[i] == '('){ if(Invertido == 0){ if(Usado == 0){ Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 0, 0)); Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 1, 1)); } else { Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 0, 1)); } } else { Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 1, 1)); Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 0, 1)); } } else if(s[i] == ')'){ if(Invertido == 0){ if(Usado == 0){ Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 0, 0)); Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 1, 1)); } else { Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 0, 1)); } } else { Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 1, 1)); Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 0, 1)); } } else { if(Invertido == 0){ if(Usado == 0){ Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 0, 0)); Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 1, 1)); Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 0, 0)); Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 1, 1)); } else { Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 0, 1)); Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 0, 1)); } } else { Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 1, 1)); Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 0, 1)); Retorno = Suma(Retorno, Resolver(i + 1, p + 1, 1, 1)); Retorno = Suma(Retorno, Resolver(i + 1, p - 1, 0, 1)); } } return Memorizaci_n[i][p][Invertido][Usado] = Retorno; }*/ int main(){ ios_base::sync_with_stdio(0); cin.tie(0); long long Contador = 0; cin>>n>>s; vector<long long> Posiciones; if(n % 2 == 1){ cout<<0; return 0; } for(long long i = 0; i < n; i++){ if(s[i] == 'x') Posiciones.push_back(i); } if(Posiciones.empty()){ long long Par_ntesis = 0; for(long long i = 0; i < n; i++){ if(s[i] == '(') Par_ntesis++; else Par_ntesis--; if(Par_ntesis < 0) break; } if(Par_ntesis == 0) cout<<1; else { for(long long i = 0; i < n; i++){ for(long long j = i; j < n; j++){ Par_ntesis = 0; for(long long k = 0; k < n; k++){ if((s[k] == '(' and (k < i or k > j)) or (s[k] == ')' and (k >= i and k <= j))) Par_ntesis++; else Par_ntesis--; if(Par_ntesis < 0) break; } if(Par_ntesis == 0){ cout<<1; return 0; } } } cout<<0; } return 0; } for(long long Probar = 0; Probar < (1LL<<(long long)Posiciones.size()); Probar++){ for(long long i = 0; i < Posiciones.size(); i++){ if(Probar & (1LL<<i)) s[Posiciones[i]] = '('; else s[Posiciones[i]] = ')'; } bool Continuar = 1; for(long long i = 0; i < n and Continuar; i++){ for(long long j = i; j < n and Continuar; j++){ long long Par_ntesis = 0; for(long long k = 0; k < n; k++){ if((s[k] == '(' and (k < i or k > j)) or (s[k] == ')' and (k >= i and k <= j))) Par_ntesis++; else Par_ntesis--; if(Par_ntesis < 0) break; } if(Par_ntesis == 0){ Contador++; Continuar = 0; } } } if(Continuar){ long long Par_ntesis = 0; for(long long i = 0; i < n and Continuar; i++){ if(s[i] == '(') Par_ntesis++; else Par_ntesis--; if(Par_ntesis < 0) Continuar = 0; } if(Continuar and Par_ntesis == 0) Contador++; } //cout<<s<<" "<<((Continuar == 0) ? "Bien" : "Mal")<<"\n"; } cout<<Contador; /*vector<long long> Posiciones; if(n % 2 == 1){ cout<<0; return 0; } for(long long i = 0; i < n; i++){ if(s[i] == 'x') Posiciones.push_back(i); } if(Posiciones.empty()){ vector< vector< vector< vector<bool> > > > Memorizaci_n(n + 2, vector< vector< vector<bool> > >(n / 2 + 22, vector< vector<bool> >(2, vector<bool>(2, 0)))); Memorizaci_n[n][0][0][0] = 1; Memorizaci_n[n][0][0][1] = 1; for(long long i = n - 1; i > -1; i--){ for(long long p = 0; p < n / 2 + 16; p++){ for(long long Invertido = 0; Invertido < 2; Invertido++){ for(long long Usado = 0; Usado < 2; Usado++){ if(s[i] == '('){ if(Invertido == 0){ if(Usado == 0){ Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][0][0]; if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][1][1]; } else { Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][0][1]; } } else { if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][1][1]; Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][0][1]; } } else if(s[i] == ')'){ if(Invertido == 0){ if(Usado == 0){ if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][0][0]; Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][1][1]; } else { if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][0][1]; } } else { Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][1][1]; if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][0][1]; } } cout<<i<<" "<<p<<" "<<Invertido<<" "<<Usado<<" "<<s[i]<<" "<<Memorizaci_n[i][p][Invertido][Usado]<<"\n"; } } } } cout<<Memorizaci_n[0][0][0][0]; return 0; } else { for(long long Probar = 0; Probar < (1LL<<(long long)Posiciones.size()); Probar++){ for(long long j = 0; j < Posiciones.size(); j++){ if(Probar & (1LL<<j)) s[Posiciones[j]] = '('; else s[Posiciones[j]] = ')'; } vector< vector< vector< vector<bool> > > > Memorizaci_n(n + 2, vector< vector< vector<bool> > >(n + 2, vector< vector<bool> >(2, vector<bool>(2, 0)))); Memorizaci_n[n][0][0][0] = 1; Memorizaci_n[n][0][0][1] = 1; for(long long i = n - 1; i > -1; i--){ for(long long p = 0; p < n / 2 + 16; p++){ for(long long Invertido = 0; Invertido < 2; Invertido++){ for(long long Usado = 0; Usado < 2; Usado++){ cout<<i<<" "<<p<<" "<<Invertido<<" "<<Usado<<" "<<s[i]<<"\n"; if(s[i] == '('){ if(Invertido == 0){ if(Usado == 0){ Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][0][0]; if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][1][1]; } else { Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][0][1]; } } else { if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][1][1]; Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][0][1]; } } else if(s[i] == ')'){ if(Invertido == 0){ if(Usado == 0){ if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][0][0]; Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][1][1]; } else { if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][0][1]; } } else { Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p + 1][1][1]; if(p > 0) Memorizaci_n[i][p][Invertido][Usado] = Memorizaci_n[i][p][Invertido][Usado] or Memorizaci_n[i + 1][p - 1][0][1]; } } } } } } Contador += Memorizaci_n[0][0][0][0]; } cout<<Contador % m; }*/ //Memorizaci_n.assign(n + 2, vector< vector< vector<long long> > >(n + 2, vector< vector<long long> >(2, vector<long long>(2, -2)))); //cout<<Resolver(0, 0, 0, 0) % m; /*for(long long i = n; i > -1; i--){ vector< vector< vector<long long> > > Memorizaci_n(n + 2, vector< vector<long long> >(n / 2 + 22, vector<long long>(2, 0))); Memorizaci_n[n][0][0] = 1; //Memorizaci_n[n][0][1] = 1; for(long long j = n - 1; j > -1; j--){ for(long long k = 1; k < n / 2 + 16; k++){ for(long long l = 0; l < 2; l++){ switch(s[j]){ case '(': if(l == 0){ if(j >= i - 1) Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k + 1][0], Memor orzaci_n[j + 1][k + 1][1]); else Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k + 1][0]; } else if(j >= i and k > 0) Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k - 1][0], Memor orzaci_n[j + 1][k - 1][1]); break; case ')': if(l == 0){ if(j >= i - 1 and k > 0) Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k - 1][0], Memor orzaci_n[j + 1][k - 1][1]); else if(k > 0) Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k - 1][0]; } else if(j >= i) Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k + 1][0], Memor orzaci_n[j + 1][k + 1][1]); break; case 'x': if(l == 0){ if(j >= i - 1) Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k + 1][0], Memor orzaci_n[j + 1][k + 1][1]); else Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k + 1][0]; } else if(j >= i and k > 0) Memorizaci_n[j][k][l] = Memorizaci_n[j + 1][k - 1][0], Memor orzaci_n[j + 1][k - 1][1]); if(l == 0){ if(j >= i - 1 and k > 0) Memorizaci_n[j][k][l] += Memorizaci_n[j + 1][k - 1][0], Memor orzaci_n[j + 1][k - 1][1]); else if(k > 0) Memorizaci_n[j][k][l] += Memorizaci_n[j + 1][k - 1][0]; } else if(j >= i) Memorizaci_n[j][k][l] += Memorizaci_n[j + 1][k + 1][0], Memor orzaci_n[j + 1][k + 1][1]); Memorizaci_n[j][k][l] %= m; break; } } } for(auto E: Memorizaci_n){ for(auto e : E){ cout<<e[0]<<" "; } cout<<"\n"; } cout<<"\n"; for(auto E: Memorizaci_n){ for(auto e : E){ cout<<e[1]<<" "; } cout<<"\n"; } cout<<"\n"; cout<<"\n"; } if(i == 0) Contador = Contador, Memorizaci_n[0][0][1]); or else Contador = Contador, Meorizaci_n[0][0][0]); or }*/ return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...