标签:
题意:给定一串括号,求最长的规则(‘(())‘或‘(()())’)的字串及最长字串的个数;
思路:使用栈保存左括号,与最近的右括号匹配,使用递推推出每个位置最长字串长度;
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<stack> using namespace std; stack<int> t; int n,m,len,maxx; int dp[5000100]; char str[5000100]; int main(){ while(scanf("%s",str)!=EOF){ int i,j,k; len=strlen(str); memset(dp,0,sizeof(dp)); for(i=0;i<len;i++){ if(str[i]==‘(‘){ //左括号入栈 t.push(i); } else{ if(!t.empty()){ int temp=t.top(); t.pop(); if(temp){ dp[i]=dp[temp-1]+i-temp+1;//推出最长连续长度()+() } else dp[i]=i-temp+1; //temp==0时 } } } maxx=0; int cnt=0; for(i=0;i<len;i++){ if(maxx<dp[i]){ maxx=dp[i]; cnt=1; } else if(maxx==dp[i]){ cnt++; } } if(maxx==0) printf("0 1\n"); else printf("%d %d\n",maxx,cnt); } return 0; }
CodeForces 5C Longest Regular Bracket Sequence
标签:
原文地址:http://www.cnblogs.com/dominatingdashuzhilin/p/4687181.html