【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)

题目

传送门:QWQ

 

 

分析

洛谷题解里有一位大佬讲的很好。

就是先用栈预处理出可以匹配的左右括号在数组中设为1

其他为0

最后求一下最长连续1的数量。

 

代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6+10;
 4 char  s[maxn];
 5 int vis[maxn], Stack[maxn], top;
 6 int main(){
 7     scanf("%s",s+1);
 8     int n=strlen(s+1);
 9     for(int i=1;i<=n;i++){
10         if(s[i]=='('){ Stack[++top]=i;  }
11         else if(top){
12             vis[i]=1; vis[Stack[top]]=1; top--;
13         }
14     }
15     int preans=0,ans=0;
16     for(int i=1;i<=n;i++){
17         if(vis[i]) preans++;
18         else preans=0;
19         ans=max(ans,preans);
20     }
21     preans=0;
22     int tot=0;
23     for(int i=1;i<=n;i++){
24         if(vis[i]) preans++;
25         else preans=0;
26         if(preans==ans && ans!=0)  tot++;
27     }
28     if(!(ans==0&&tot==0)) printf("%d %d",ans,tot);
29     else puts("0 1");
30     return 0;
31 }

 

posted @ 2018-08-23 23:34  noble_(noblex)  阅读(181)  评论(0编辑  收藏  举报
/* */