Codeforces 5C Longest Regular Bracket Sequence(DP+括号匹配)
题目链接:http://codeforces.com/problemset/problem/5/C
题目大意:
给出一串字符串只有'('和')',求出符合括号匹配规则的最大字串长度及该长度的字串出现的次数。
解题思路:
设dp[i]为到i的最大括号匹配,
我们每次遇到一个'('就将其下标存入栈中,每次遇到')'就取出当前栈中里它最近的'('下标即栈顶t。
不能直接dp[i]=i-t+1,比如(()()())这样的例子就会出错,应为dp[i]=dp[i-1]+i-t+1。
代码
1 #include<bits/stdc++.h> 2 #define lc(a) (a<<1) 3 #define rc(a) (a<<1|1) 4 #define MID(a,b) ((a+b)>>1) 5 #define fin(name) freopen(name,"r",stdin) 6 #define fout(name) freopen(name,"w",stdout) 7 #define clr(arr,val) memset(arr,val,sizeof(arr)) 8 #define _for(i,start,end) for(int i=start;i<=end;i++) 9 #define FAST_IO ios::sync_with_stdio(false);cin.tie(0); 10 using namespace std; 11 typedef long long LL; 12 const int N=1e6+5; 13 const int INF=0x3f3f3f3f; 14 const double eps=1e-10; 15 16 int dp[N]; 17 stack<int>sk; 18 19 int main(){ 20 FAST_IO; 21 string str; 22 cin>>str; 23 int len=0,cnt=0; 24 for(int i=0;i<str.length();i++){ 25 if(str[i]=='(') 26 sk.push(i); 27 else{ 28 if(!sk.empty()){ 29 int t=sk.top(); 30 sk.pop(); 31 dp[i]=dp[t-1]+i-t+1; 32 if(dp[i]>len){ 33 len=dp[i]; 34 cnt=1; 35 } 36 else if(dp[i]==len) 37 cnt++; 38 } 39 } 40 } 41 if(len==0) 42 cout<<"0 1"<<endl; 43 else 44 cout<<len<<" "<<cnt<<endl; 45 return 0; 46 }