Submission #1348071

#TimeUsernameProblemLanguageResultExecution timeMemory
1348071avighnaMisspelling (JOI22_misspelling)C++20
28 / 100
535 ms1114112 KiB
#include <bits/stdc++.h>

using namespace std;

const int md = 1e9 + 7;

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);

  int n, m;
  cin >> n >> m;
  vector<vector<int>> leqs(n), geqs(n);
  for (int i = 0, a, b; i < m; ++i) {
    cin >> a >> b;
    --a, --b;
    if (a <= b) {
      leqs[a].push_back(b);
    } else {
      geqs[b].push_back(a);
    }
  }
  for (int i = 0; i < n; ++i) {
    sort(leqs[i].begin(), leqs[i].end());
    sort(geqs[i].begin(), geqs[i].end());
  }

  // dp[i][j][ch] = answer for i...n if s[i] = ch, j<=i, and s[j]=s[j+1]=...=s[i]
  vector dp(n, vector(n, vector<int64_t>(26)));
  for (int i = n - 1; i >= 0; --i) {
    for (int j = 0; j <= i; ++j) {
      for (int ch = 0; ch < 26; ++ch) {
        if (i == n - 1) {
          dp[i][j][ch] = 1;
          continue;
        }
        int nchl = 0, nchr = 25;
        for (int k = j; k <= i; ++k) {
          // check conditions at k
          auto it1 = upper_bound(leqs[k].begin(), leqs[k].end(), i);
          if (it1 != leqs[k].end()) {
            nchr = ch;
          }
          auto it2 = upper_bound(geqs[k].begin(), geqs[k].end(), i);
          if (it2 != geqs[k].end()) {
            nchl = ch;
          }
        }
        for (int nch = nchl; nch <= nchr; ++nch) {
          dp[i][j][ch] = (dp[i][j][ch] + dp[i + 1][ch == nch ? j : i + 1][nch]) % md;
        }
      }
    }
  }

  int64_t ans = 0;
  for (int ch = 0; ch < 26; ++ch) {
    ans = (ans + dp[0][0][ch]) % md;
  }
  cout << ans << '\n';
}
#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...