D题50
#include<iostream> #include<stack> #include<algorithm> using namespace std; int cnt[3]; string s; int n,a,b; int id[1021],fa[1021]; int col[1021]; bool vis[1021]; int idcnt=0; stack<int> sta; int rht_to[1021]; int main(){ cin >> n >> a >> b; cin >> s; s="("+s+")"; for(int i=0,len=s.length();i<len;i++){ if(s[i]=='('){ id[i]=++idcnt; if(sta.empty()){ fa[id[i]]=id[i]; } else{ fa[id[i]]=sta.top(); } sta.push(id[i]); } else{ id[i]=sta.top(); sta.pop(); } } for(int i=0;i<n+2;i++){ if(s[i+1]=='(') rht_to[id[i]]=id[i+1]; else rht_to[id[i]]=fa[id[i]]; // cout << rht_to[id[i]] << ' '; } // cout << '\n'; // for(int i=0;i<n+2;i++){ // cout << id[i] << ' '; // } // cout << '\n'; col[0]=0; for(int i=1,len=s.length()-1;i<len;i++){ if(vis[id[i]]){ // cout << col[id[i]] << ' '; continue; } if(col[id[i-1]]==col[rht_to[id[i]]]){ col[id[i]]=(col[id[i-1]]==1?2:1); } else{ col[id[i]]=(3-col[id[i-1]]-col[rht_to[id[i]]])%3; } vis[id[i]]=1; ++cnt[col[id[i]]]; // cout << col[id[i]] << ' '; } sort(cnt,cnt+3); cout << cnt[2]*max(a,b)+cnt[1]*min(a,b); return 0; }
我的代码,只有50分,有hack吗?