#include <iostream>
#include <vector>
using namespace std;
/* 所有最终状态如下
0开头的 0,01,02,012,021, 5种
0:全是0号色
01:前半部分0号色,后半部分1号色
012:分3部分3种颜色
1,2开头也是一样,总共15种类
k表示最终状态
dp[k][i]表示,k状态的第i个气球消耗的时间
2个bit表示一个气球颜色,减少内存浪费,只填充有效的k数组,方便下标索引,0~63范围内的k中不使用的数组为空
特别注意:单个t达到1e7,n为1e5,int32会溢出,因此需要int64
*/
int GetK(int a, int b=-1, int c=-1);
int GetK(int a, int b, int c) {
if(b == -1) {
b = a;
}
if(c == -1) {
c = a;
}
return (((a << 2) + b) << 2) + c;
}
void InitDp(vector<vector<int64_t>>& dp, int n, int a, int b, int c) {
#define INIT_VEC(k) dp[k].assign(n+1, -1);\
//cout << "valid k: " << k << endl;
INIT_VEC(GetK(a));
INIT_VEC(GetK(a,b));
INIT_VEC(GetK(a,c));
INIT_VEC(GetK(a,b,c));
INIT_VEC(GetK(a,c,b));
#undef INIT_VEC
}
int64_t Min(int64_t a, int64_t b) {
if(a < 0) {
return b;
}
if(b < 0) {
return a;
}
return min(a,b);
}
int main() {
int n;
string color;
cin >> n >> color;
vector<int> t(n);
for(auto& v : t) {
cin >> v;
}
vector<vector<int64_t>> dp(64);
InitDp(dp,n, 0,1,2);
InitDp(dp,n, 1,0,2);
InitDp(dp,n, 2,0,1);
dp[GetK(0)][0] = 0;
dp[GetK(1)][0] = 0;
dp[GetK(2)][0] = 0;
for(auto i = 1; i <= n; i++) {
// 变成x颜色消耗的时间
vector<int> cost(3,t[i-1]);
// 当前颜色不用变更
cost[color[i-1] - '0'] = 0;
dp[GetK(0)][i] = dp[GetK(0)][i-1] + cost[0];
dp[GetK(1)][i] = dp[GetK(1)][i-1] + cost[1];
dp[GetK(2)][i] = dp[GetK(2)][i-1] + cost[2];
if(i >= 2) {
dp[GetK(0,1)][i] = Min(dp[GetK(0)][i-1],dp[GetK(0,1)][i-1]) + cost[1];
dp[GetK(0,2)][i] = Min(dp[GetK(0)][i-1],dp[GetK(0,2)][i-1]) + cost[2];
dp[GetK(1,0)][i] = Min(dp[GetK(1)][i-1],dp[GetK(1,0)][i-1]) + cost[0];
dp[GetK(1,2)][i] = Min(dp[GetK(1)][i-1],dp[GetK(1,2)][i-1]) + cost[2];
dp[GetK(2,0)][i] = Min(dp[GetK(2)][i-1],dp[GetK(2,0)][i-1]) + cost[0];
dp[GetK(2,1)][i] = Min(dp[GetK(2)][i-1],dp[GetK(2,1)][i-1]) + cost[1];
}
if(i >= 3) {
dp[GetK(0,1,2)][i] = Min(dp[GetK(0,1)][i-1],dp[GetK(0,1,2)][i-1]) + cost[2];
dp[GetK(0,2,1)][i] = Min(dp[GetK(0,2)][i-1],dp[GetK(0,2,1)][i-1]) + cost[1];
dp[GetK(1,0,2)][i] = Min(dp[GetK(1,0)][i-1],dp[GetK(1,0,2)][i-1]) + cost[2];
dp[GetK(1,2,0)][i] = Min(dp[GetK(1,2)][i-1],dp[GetK(1,2,0)][i-1]) + cost[0];
dp[GetK(2,0,1)][i] = Min(dp[GetK(2,0)][i-1],dp[GetK(2,0,1)][i-1]) + cost[1];
dp[GetK(2,1,0)][i] = Min(dp[GetK(2,1)][i-1],dp[GetK(2,1,0)][i-1]) + cost[0];
}
}
int64_t vMin = 1e18;
for(auto& vec : vector<vector<int>>{{0,1,2},{1,0,2},{2,0,1}}) {
auto a = vec[0];
auto b = vec[1];
auto c = vec[2];
#define GET_MIN(k) vMin = Min(dp[k][n], vMin);\
// printf("K:[%d:%d:%d]\n", k >> 4, (k >> 2)&3, k&3);\
// for(auto& v : dp[k]) {\
// cout << v << " ";\
// }\
// cout << endl;
GET_MIN(GetK(a));
GET_MIN(GetK(a,b));
GET_MIN(GetK(a,c));
GET_MIN(GetK(a,b,c));
GET_MIN(GetK(a,c,b));
#undef GET_MIN
}
cout << vMin << endl;
}
// 64 位输出请用 printf("%lld")