#include <cstdio> #include <vector> #include <deque> #include <algorithm> using namespace std; #define MAX_K 1000010 #define MAX_M 1000010 int N, M, o, mo, p, s, mS, dP, dV, t; long long mZ, z; vector<int> k, l; vector<deque<int>> mP; char c[MAX_M]; int gcd(int a, int b) { if (a < b) { swap(a, b); } while (b != 0) { t = a % b; a = b; b = t; } return a; } int gmp(int v) { return mP[2 * mo + v + dV].front() + dP; } int main() { scanf("%d", &N); k.resize(N); for (int i = 0; i < N; i++) { scanf("%d", &k[i]); } scanf("%d", &M); scanf("%s", c); l.resize(M); for (int i = M; i < N; i++) { p = i % M; if (k[i] < k[p]) { k[p] = k[i]; l[p] = i - p; } } o = gcd(M, N); mo = M / o; mZ = -1LL; for (int i = 0; i < o; i++) { s = mS = 0; mP.clear(); mP.resize(4 * mo + 1); for (int j = 0, p = i; j < mo; j++, p = (p + N) % M) { s += c[p] == 'W' ? -1 : 1; mP[2 * mo + s].push_back(j); if (s > mS) { mS = s; } } for (int j = 0, p = i; j < mo; j++, p = (p + N) % M) { s += c[p] == 'W' ? -1 : 1; mP[2 * mo + s].push_back(mo + j); } s = s / 2; dP = dV = 0; for (int j = 0, p = i; j < mo; j++, p = (p + N) % M) { if (p < N) { if (k[p] <= mS) { z = 1LL * gmp(k[p]) * N + 1LL * (l[p] + p + 1); if (mZ == -1LL || z < mZ) { mZ = z; } } else if (s > 0) { t = (k[p] - mS) / s; if (t * s < k[p] - mS) { t++; } z = 1LL * t * N * mo + 1LL * gmp(k[p] - t * s) * N + 1LL * (l[p] + p + 1); if (mZ == -1LL || z < mZ) { mZ = z; } } } dP--; mP[2 * mo + dP].pop_front(); if (c[p] == 'W') { dV--; mS++; } else { dV++; if (mS > s) { mS--; } } } } printf("%lld\n", mZ); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <cstdio> #include <vector> #include <deque> #include <algorithm> using namespace std; #define MAX_K 1000010 #define MAX_M 1000010 int N, M, o, mo, p, s, mS, dP, dV, t; long long mZ, z; vector<int> k, l; vector<deque<int>> mP; char c[MAX_M]; int gcd(int a, int b) { if (a < b) { swap(a, b); } while (b != 0) { t = a % b; a = b; b = t; } return a; } int gmp(int v) { return mP[2 * mo + v + dV].front() + dP; } int main() { scanf("%d", &N); k.resize(N); for (int i = 0; i < N; i++) { scanf("%d", &k[i]); } scanf("%d", &M); scanf("%s", c); l.resize(M); for (int i = M; i < N; i++) { p = i % M; if (k[i] < k[p]) { k[p] = k[i]; l[p] = i - p; } } o = gcd(M, N); mo = M / o; mZ = -1LL; for (int i = 0; i < o; i++) { s = mS = 0; mP.clear(); mP.resize(4 * mo + 1); for (int j = 0, p = i; j < mo; j++, p = (p + N) % M) { s += c[p] == 'W' ? -1 : 1; mP[2 * mo + s].push_back(j); if (s > mS) { mS = s; } } for (int j = 0, p = i; j < mo; j++, p = (p + N) % M) { s += c[p] == 'W' ? -1 : 1; mP[2 * mo + s].push_back(mo + j); } s = s / 2; dP = dV = 0; for (int j = 0, p = i; j < mo; j++, p = (p + N) % M) { if (p < N) { if (k[p] <= mS) { z = 1LL * gmp(k[p]) * N + 1LL * (l[p] + p + 1); if (mZ == -1LL || z < mZ) { mZ = z; } } else if (s > 0) { t = (k[p] - mS) / s; if (t * s < k[p] - mS) { t++; } z = 1LL * t * N * mo + 1LL * gmp(k[p] - t * s) * N + 1LL * (l[p] + p + 1); if (mZ == -1LL || z < mZ) { mZ = z; } } } dP--; mP[2 * mo + dP].pop_front(); if (c[p] == 'W') { dV--; mS++; } else { dV++; if (mS > s) { mS--; } } } } printf("%lld\n", mZ); return 0; } |