-
题目描述:
-
给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配;所有的右括号都有唯一的左括号匹配。例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是。需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数。
-
输入:
-
测试数据包括多个,每个测试数据包含两行:第一行为一个整数N,其中N不会超过10^6。第二行为一个长度为N的字符串,这个字符串由左括号'('和右括号')'组成。
-
输出:
- 对应每个测试案例,输出一行,其中包含两个整数,分别代表最长合法括号序列的长度和个数,中间由空格隔开。若没有合法的子序列存在,则返回0 1。
-
样例输入:
-
6 (())() 3 ))(
-
样例输出:
-
6 1
0 1
-
-
/
-
每遇到一个)就向前找(,将他俩统一记为 1,统计连续1的最多的个数。
-
-
#include<stack> #include<iostream> #include<string.h> using namespace std; char s[1000001]; int main() { int n,j,k; bool ga; while(cin>>n&&n>0) { cin>>s; for(j=0;j<n;j++) { ga=false; if(s[j]=='(') ; else { for(k=j-1;k>=0;k--) { if(s[k]=='(') { s[k]='1'; s[j]='1'; break; } else if(s[k]==')') break; } } } int maxl=0; int maxln=0; int jb; for(j=0;j<n;j++) { jb=j; while(s[j]=='1') j++; if(maxl==0) { maxl=j-jb; maxln=1; } else if(maxl>0&&maxl==j-jb) maxln++; else if(maxl>0&&maxl<j-jb) { maxl=j-jb; maxln=1; } } if(maxln==0) cout<<"0 1"<<endl; else cout<<maxl<<" "<<maxln<<endl; } return 0; } /************************************************************** Problem: 1337 User: 午夜小白龙 Language: C++ Result: Accepted Time:960 ms Memory:2496 kb ****************************************************************/