【codechef】括号匹配,求子串最大值(灵活题)

来源:互联网 发布:tomcat 域名绑定 编辑:程序博客网 时间:2024/05/21 15:43

 Input34()()-1 -2 3 44(()]-1 -2 3 44[{]{1 2 3 4Sample Output710

Explanation

For first test case take last 2 elements: 3 + 4 = 7. 
For second test case take the middle 2 elements: -2 + 3 = 1

http://www.codechef.com/problems/SUBARRAY/

#include<iostream>#include<algorithm>#include<string>#include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};#include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;}#include<vector>#include<cmath>#include<stack>#include<string.h>#include<stdlib.h>#include<cstdio>#define mod 1e9+7#define ll long longusing namespace std;map<char,int> r;ll x[100010];ll sum[100010];char y[100010];int n;int main(){r[']']='[';r['}']='{';r['>']='<';r[')']='(';int t;scanf("%d",&t);while(t--){//memset(sum,0,sizeof(sum)); 会超时 scanf("%d", &n);getchar();for(int i=1;i<=n;++i)        scanf("%c",&y[i]);        for(int i=1;i<=n;++i){            scanf("%lld",&x[i]);            sum[i]=0;            x[i]+=x[i-1];        }        stack<int> st;        ll s=0;        for(int i=1;i<=n;++i){        int u=0;        if(st.size()>0){        if(r[y[i]]==y[st.top()])        u=1;        }        if(u==1){        sum[i]=max(0ll,sum[st.top()-1]+x[i]-x[st.top()-1]);//((())())         s=max(s,sum[i]);        st.pop();        }        else        st.push(i);        }        printf("%lld\n", s);}    return 0;}


0 0
原创粉丝点击