Submission #501712

#TimeUsernameProblemLanguageResultExecution timeMemory
501712600MihneaLinear Garden (IOI08_linear_garden)C++17
100 / 100
96 ms33656 KiB
#include <bits/stdc++.h>

using namespace std;


const int N = (int) 1e6 + 7;

int n;
int mod;
string s;

int whenStart[3][3][N];
int dp[3][3][N];
bool done[3][3];

void add(int i, int j, int k, int val) {
  assert(0 <= i && i < 3);
  assert(0 <= j && j <= i);
  assert(0 <= k && k <= n);
  dp[i][j][k] += val;
  if (dp[i][j][k] >= mod) {
    dp[i][j][k] -= mod;
  }
}

void compute(int init_dif, int init_current) {
  assert(init_current <= init_dif);
  if (done[init_dif][init_current]) return;
  done[init_dif][init_current] = 1;
  for (int d = 0; d < 3; d++) {
    for (int p = 0; p <= d; p++) {
      for (int i = 0; i <= n; i++) {
        dp[d][p][i] = 0;
      }
    }
  }
  dp[init_dif][init_current][0] = 1;
  for (int i = 0; i < n; i++) {
    for (int dif = 0; dif < 3; dif++) {
      for (int pos = 0; pos <= dif; pos++) {
        if (int coef = dp[dif][pos][i]) {
          /// -1
          if (pos > 0) {
            add(dif, pos - 1, i + 1, coef);
          } else {
            if (dif + 1 <= 2) {
              add(dif + 1, 0, i + 1, coef);
            }
          }

          /// +1
          if (pos < dif) {
            add(dif, pos + 1, i + 1, coef);
          } else {
            if (dif + 1 <= 2) {
              add(dif + 1, dif + 1, i + 1, coef);
            }
          }
        }
      }
    }
  }
  for (int i = 0; i <= n; i++) {
    whenStart[init_dif][init_current][i] = 0;
    for (int dif = 0; dif < 3; dif++) {
      for (int pos = 0; pos <= dif; pos++) {
        whenStart[init_dif][init_current][i] += dp[dif][pos][i];
        if (whenStart[init_dif][init_current][i] >= mod) whenStart[init_dif][init_current][i] -= mod;
      }
    }
  }
}

int get(int dif, int current, int rem) {
  bool ok = (0 <= current && current <= dif && dif < 3);
  if (!ok) {
    return 0;
  }
  compute(dif, current);
  return whenStart[dif][current][rem];
}


signed main() {
  /// L < P

 ios::sync_with_stdio(0); cin.tie(0);

  ///freopen ("input", "r", stdin);

  cin >> n >> mod >> s;


  int dif = 0, pos = 0, cnt = 1;
  int rem = n;

  for (auto &ch : s) {
    int x;
    if (ch == 'L') {
      x = -1;
    } else {
      x = +1;
    }
    int X = pos, Y = dif;
    x = -1;
    if (x == -1) {
      if (pos > 0) {
        pos--;
      } else {
        dif++;
        pos = 0;
      }
    } else {
      if (pos < dif) {
        pos++;
      } else {
        dif++;
        pos = dif;
      }
    }
    rem--;
    if (ch == 'L') {
      x = -1;
    } else {
      cnt += get(dif, pos, rem);
      if (cnt >= mod) cnt -= mod;
      x = +1;
    }
    pos = X;
    dif = Y;
    if (x == -1) {
      if (pos > 0) {
        pos--;
      } else {
        dif++;
        pos = 0;
      }
    } else {
      if (pos < dif) {
        pos++;
      } else {
        dif++;
        pos = dif;
      }
    }
    assert(dif <= 2);
  }

  cout << cnt << "\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...