// C++ program to find length of the
// longest valid substring
#include <iostream>
#include <stack>
using namespace std;
int maxLength( string s) {
stack< int > st;
// Push -1 as the initial index to
// handle the edge case
st.push ( - 1 ) ;
int maxLen = 0 ;
int curr = 0 ;
// Traverse the string
for ( int i = 0 ; i < s.length ( ) ; i++ ) {
// If we encounter an opening parenthesis,
// push its index
if ( s[ i] == '(' ) {
st.push ( i) ;
} else {
// If we encounter a closing parenthesis,
// pop the stack
st.pop ( ) ;
// If stack is empty, push the current index
// as a base for the next valid substring
if ( st.empty ( ) ) {
st.push ( i) ;
curr = 0 ;
} else {
curr + = 2 ;
cout << curr << ' ' << i - st.top ( ) << '\n ' ;
// Update maxLength with the current length
// of the valid parentheses substring
maxLen = max( maxLen, i - st.top ( ) ) ;
}
}
}
return maxLen;
}
int main( ) {
string s = "(())))()())()()(()(()(()))(()(())(()(())(())((()())))())()()(()())(((())))(())()))())(((()((()(((()((((())()(((((()()(()(((())(((())((((())((()(((())))()()))()))()(())((((((()())(()))()()(()(())))((()()(()(((((())))(((()()((()))()(()(())(((())))))" ;
cout << maxLength( s) << endl;
return 0 ;
}
Ly8gQysrIHByb2dyYW0gdG8gZmluZCBsZW5ndGggb2YgdGhlIAovLyBsb25nZXN0IHZhbGlkIHN1YnN0cmluZwoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RhY2s+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWF4TGVuZ3RoKHN0cmluZyBzKSB7CiAgICBzdGFjazxpbnQ+IHN0OwoKICAgIC8vIFB1c2ggLTEgYXMgdGhlIGluaXRpYWwgaW5kZXggdG8gCiAgICAgIC8vIGhhbmRsZSB0aGUgZWRnZSBjYXNlCiAgICBzdC5wdXNoKC0xKTsKICAgIGludCBtYXhMZW4gPSAwOwogIAlpbnQgY3VyciA9IDA7CgogICAgLy8gVHJhdmVyc2UgdGhlIHN0cmluZwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKICAgICAgICAKICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gb3BlbmluZyBwYXJlbnRoZXNpcywKICAgICAgICAgIC8vIHB1c2ggaXRzIGluZGV4CiAgICAgICAgaWYgKHNbaV0gPT0gJygnKSB7CiAgICAgICAgICAgIHN0LnB1c2goaSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIElmIHdlIGVuY291bnRlciBhIGNsb3NpbmcgcGFyZW50aGVzaXMsCiAgICAgICAgICAgICAgLy8gcG9wIHRoZSBzdGFjawogICAgICAgICAgICBzdC5wb3AoKTsKCiAgICAgICAgICAgIC8vIElmIHN0YWNrIGlzIGVtcHR5LCBwdXNoIHRoZSBjdXJyZW50IGluZGV4IAogICAgICAgICAgICAvLyBhcyBhIGJhc2UgZm9yIHRoZSBuZXh0IHZhbGlkIHN1YnN0cmluZwogICAgICAgICAgICBpZiAoc3QuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgc3QucHVzaChpKTsKICAgICAgICAgICAgICAJY3VyciA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJyICs9IDI7CiAgICAgICAgICAgICAgCWNvdXQgPDwgY3VyciA8PCAnICcgPDwgaSAtIHN0LnRvcCgpIDw8ICdcbic7CiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4TGVuZ3RoIHdpdGggdGhlIGN1cnJlbnQgbGVuZ3RoIAogICAgICAgICAgICAgICAgLy8gb2YgdGhlIHZhbGlkIHBhcmVudGhlc2VzIHN1YnN0cmluZwogICAgICAgICAgICAgICAgbWF4TGVuID0gbWF4KG1heExlbiwgaSAtIHN0LnRvcCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWF4TGVuOwp9CgppbnQgbWFpbigpIHsKICAgIHN0cmluZyBzID0gIigoKSkpKSgpKCkpKCkoKSgoKSgoKSgoKSkpKCgpKCgpKSgoKSgoKSkoKCkpKCgoKSgpKSkpKCkpKCkoKSgoKSgpKSgoKCgpKSkpKCgpKSgpKSkoKSkoKCgoKSgoKCkoKCgoKSgoKCgoKSkoKSgoKCgoKCkoKSgoKSgoKCgpKSgoKCgpKSgoKCgoKSkoKCgpKCgoKCkpKSkoKSgpKSkoKSkpKCkoKCkpKCgoKCgoKCkoKSkoKCkpKSgpKCkoKCkoKCkpKSkoKCgpKCkoKCkoKCgoKCgpKSkpKCgoKCkoKSgoKCkpKSgpKCgpKCgpKSgoKCgpKSkpKSkiOyAKICAgIGNvdXQgPDwgbWF4TGVuZ3RoKHMpIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=