CodeForces

来源:互联网 发布:软件外包接单 编辑:程序博客网 时间:2024/06/06 09:00

题意:给定一个由字符 ( 和 ) 组成的字符串。您需要找出它的最长子串,且该子串是一个合格的括号序列。同时,还需要找出这样的子串的数目。(像(),(())样的为合格的括号序列,((()())为不合格);
思路:设dp[i]表示到第i个右括号所获串的长度。则dp[i]=dp[t-1]+i-t+1。t表示离i最近的那个左括号的位置。

#include<iostream>#include<algorithm>#include<string>#include<cstring>#include<map>#include<queue>#include<cmath>#include<stack>#include<vector>#include<cstdio>#define MAXN 33000#define INF 0x3f3f3f3f#define lmid l,m,rt<<1#define rmid m+1,r,rt<<1|1#define ls rt<<1#define rs rt<<1|1#define Mod 1000000007#define i64 __int64#define LIMIT_ULL 100000000000000000using namespace std;char s[1000005];  int dp[1000005];  stack<int> st;  int main()  {       scanf("%s",s+1);       int cnt=0,ans=0,i,l=strlen(s+1);       for(i=1;i<=l;++i)       {            if(s[i]=='(') st.push(i);            else            {                 if(!st.empty())                 {                      int t=st.top();                      st.pop();                      dp[i]=dp[t-1]+i-t+1;                      if(dp[i]>ans)                      {                           ans=dp[i];                           cnt=1;                      }                      else if(dp[i]==ans) ++cnt;                 }            }       }       if(!ans) cnt=1;       printf("%d %d\n",ans,cnt);       return 0;  }