#include using namespace std; int main(){ int N; cin>>N; vector P(N); assert(2 <= N && N <= 300000); set pst; for(int i = 0; i < N; i++){ cin >> P[i]; assert(1 <= P[i] && P[i] <= N); pst.insert(P[i]); P[i]--; } assert(pst.size() == N); string S; cin >> S; assert(S.size() == N); for(auto c : S) assert(c == 'W' || c == 'B'); if(S[N - 1] == 'W' && S != string(N, 'W')){ cout << -1 << endl; return 0; } else if(S[N - 1] == 'W'){ cout << 0 << endl; return 0; } for(int i = 0; i < N; i++){ if(P[i] == N - 1){ rotate(P.begin(), P.begin() + i, P.end()); P.erase(P.begin()); break; } } vectorl(N, -1), r(N, -1); stack st; for(int i = 0; i < N; i++){ while(!st.empty() && P[st.top()] < P[i]){ l[i] = st.top(); st.pop(); } if(!st.empty()) r[st.top()] = i; st.push(i); } auto dfs = [&](auto dfs, int pos) -> int { int lv = l[pos] == -1 ? 0 : dfs(dfs, l[pos]); int rv = r[pos] == -1 ? 0 : dfs(dfs, r[pos]); if(S[P[pos]] == 'W'){ return lv + rv; } else{ return max({lv, rv, 1}); } }; cout << max(1, dfs(dfs, max_element(P.begin(), P.end()) - P.begin())) << endl; }