제출 #600845

#제출 시각아이디문제언어결과실행 시간메모리
600845MilosMilutinovicLinear Garden (IOI08_linear_garden)C++17
85 / 100
1573 ms7012 KiB
/**
 *    author:  wxhtzdy
 *    created: 21.07.2022 09:22:25
**/
#include <bits/stdc++.h>

using namespace std;

int md;

int add(int a, int b) {
  return a + b >= md ? a + b - md : a + b;
}

int mul(int a, int b) {
  return a * 1LL * b % md;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);  
  int n;
  cin >> n >> md;
  string s;
  cin >> s;              
  int bal = 2; 
  vector<vector<vector<vector<int>>>> qs(5, vector<vector<vector<int>>>(5, vector<vector<int>>(5)));
  int mn = 2, mx = 2;
  for (int i = 0; i < n; i++) {
    if (s[i] == 'P' && bal > 0 && bal - 1 - min(mn, bal - 1) <= 2 && max(mx, bal - 1) - (bal - 1) <= 2) {
      qs[bal - 1][min(mn, bal - 1)][max(mx, bal - 1)].push_back(n - i - 1);
    }
    bal += (s[i] == 'P' ? +1 : -1);
    mn = min(mn, bal);
    mx = max(mx, bal);
  }
  vector<int> cnt(n + 1);
  int ans = 1;
  for (int st = 0; st < 5; st++) {
    for (int st_mn = 0; st_mn <= st; st_mn++) {
      for (int st_mx = st; st_mx < 5; st_mx++) {
        int limit = -1;
        for (auto& p : qs[st][st_mn][st_mx]) {
          cnt[p] += 1;
          limit = max(limit, p);
        }                           
        vector<vector<vector<int>>> f(5, vector<vector<int>>(5, vector<int>(5)));
        f[st][st_mn][st_mx] = 1;
        for (int i = 0; i <= limit; i++) {
          vector<vector<vector<int>>> new_f(5, vector<vector<int>>(5, vector<int>(5)));
          for (int bal = 0; bal < 5; bal++) {
            for (int mn = 0; mn <= min(st_mn, bal); mn++) {
              for (int mx = max(st_mx, bal); mx < 5; mx++) {
                if (f[bal][mn][mx] == 0) {
                  continue;
                }
                ans = add(ans, mul(cnt[i], f[bal][mn][mx]));
                for (int d = -1; d <= 1; d += 2) {
                  int new_bal = bal + d;
                  if (new_bal >= 0 && new_bal < 5) {
                    int new_mn = min(mn, new_bal);
                    int new_mx = max(mx, new_bal);
                    if (new_bal - new_mn <= 2 && new_mx - new_bal <= 2) {
                      new_f[new_bal][new_mn][new_mx] = add(new_f[new_bal][new_mn][new_mx], f[bal][mn][mx]);
                    }
                  }
                }
              }
            }
          }
          cnt[i] = 0;
          swap(f, new_f);
        }              
      }
    }
  }
  cout << ans << '\n';
  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...
#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...
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...