#include <bits/stdc++.h>
#pragma GCC target("avx2,avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
using namespace std;
using ll = long long;
using ull = unsigned long long;
using i128 = __int128_t;
using pii = pair<int, int>;
using pll = pair<long long, long long>;
template <class T>
using vec = vector<T>;
template <class T>
using vvec = vector<vector<T>>;
constexpr char ln = '\n';
istream& operator>>(istream& is, __int128_t& x) {
  x = 0;
  string s;
  is >> s;
  int n = int(s.size()), it = 0;
  if (s[0] == '-') it++;
  for (; it < n; it++) x = (x * 10 + s[it] - '0');
  if (s[0] == '-') x = -x;
  return is;
}
ostream& operator<<(ostream& os, __int128_t x) {
  if (x == 0) return os << 0;
  if (x < 0) os << '-', x = -x;
  deque<int> deq;
  while (x) deq.emplace_front(x % 10), x /= 10;
  for (int e : deq) os << e;
  return os;
}
template <class T1, class T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "{";
  for (int i = 0; i < int(v.size()); i++) {
    if (i) os << ", ";
    os << v[i];
  }
  return os << "}";
}
template <class Container>
inline int SZ(Container& v) {
  return int(v.size());
}
template <class T>
inline void UNIQUE(vector<T>& v) {
  v.erase(unique(v.begin(), v.end()), v.end());
}
template <class T1, class T2>
inline bool chmax(T1& a, T2 b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T1, class T2>
inline bool chmin(T1& a, T2 b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
inline int topbit(ull x) { return x == 0 ? -1 : 63 - __builtin_clzll(x); }
inline int botbit(ull x) { return x == 0 ? 64 : __builtin_ctzll(x); }
inline int popcount(ull x) { return __builtin_popcountll(x); }
inline int kthbit(ull x, int k) { return (x >> k) & 1; }
inline constexpr long long TEN(int x) { return x == 0 ? 1 : TEN(x - 1) * 10; }
inline void print() { cout << "\n"; }
template <class T>
inline void print(const vector<T>& v) {
  for (int i = 0; i < int(v.size()); i++) {
    if (i) cout << " ";
    cout << v[i];
  }
  print();
}
template <class T, class... Args>
inline void print(const T& x, const Args&... args) {
  cout << x << " ";
  print(args...);
}
struct fast_ios {
  fast_ios() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
int main() {
  int N;
  cin >> N;
  vec<ll> L(N);
  for (int i = 0; i < (N); i++) cin >> L[i];
  string S;
  cin >> S;
  vec<ll> need(N + 1);
  for (int i = int(N) - 1; i >= 0; i--) {
    need[i] = need[i + 1];
    if (S[i] == 'L') need[i] += L[i];
    if (S[i] == 'W') need[i] = max(need[i] - L[i], 0LL);
  }
  ll stamina = 0;
  ll ans = 0;
  bool swim = false;
  for (int i = 0; i < (N); i++) {
    if (S[i] == 'G') {
      if (stamina + L[i] > need[i + 1]) {
        if (stamina - L[i] >= need[i + 1]) {
          ans += L[i];
          stamina -= L[i];
        } else {
          ll sky = stamina + L[i] - need[i + 1];
          ll walk = L[i] * 2 - sky;
          ans += (sky + walk * 5) / 2;
          stamina = need[i + 1];
        }
      } else {
        ans += L[i] * 5;
        stamina += L[i];
      }
    }
    if (S[i] == 'W') {
      ans += L[i] * 3;
      stamina += L[i];
      swim = true;
    }
    if (S[i] == 'L') {
      if (stamina < L[i]) {
        if (swim) {
          ans += (L[i] - stamina) * 3;
        } else {
          ans += (L[i] - stamina) * 5;
        }
        stamina = L[i];
      }
      ans += L[i];
      stamina -= L[i];
    }
  }
  ans -= stamina;
  cout << ans << ln;
}
