#include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000005 #define Inf64 4000000000000000001LL vector> E; int vnum = 0; int ps[200005]; void dfs(string &s,int &ci,int cv){ ci++; while(true){ if(ci==s.size())break; if(s[ci]==')'){ ci++; break; } vnum++; E[cv].push_back(vnum); ps[vnum] = cv; dfs(s,ci,vnum); } } int main(){ int n; cin>>n; string s; cin>>s; vector a(n); rep(i,n)cin>>a[i]; s.insert(s.begin(),'('); s.push_back(')'); a.insert(a.begin(),0); int ci = 0; E.resize(a.size()); dfs(s,ci,0); ps[0] = -1; priority_queue,vector>, function,vector)>> pq([](vector a, vector b){return a[0]*b[1]>a[1]*b[0];}); rep(i,n+1){ pq.push({1,a[i],i,1}); } dsu D(n+1); vector> ans(n+1); vector cp(n+1); vector sum(n+1),sz(n+1); rep(i,n+1){ cp[i] = i; ans[i] = {i}; sz[i] = 1; sum[i] = a[i]; } while(pq.size()>0){ auto t = pq.top(); pq.pop(); if(D.size(t[2])!=t[3])continue; int u = t[2]; int p = cp[u]; if(ps[p]==-1)continue; int v = D.leader(ps[p]); if(ans[u].size()=0;j--)ans[u].push_front(ans[v][j]); ans[v].resize(0); } D.merge(u,v); int l = D.leader(u); if(ans[u].size()>0)swap(ans[u],ans[l]); else swap(ans[v],ans[l]); cp[l] = cp[v]; sum[l] = sum[u] + sum[v]; sz[l] = sz[u] + sz[v]; pq.push({sz[l],sum[l],l,D.size(l)}); } long long Ans = 0; deque anss = ans[D.leader(0)]; rep(i,anss.size()){ // cout<