//经典动态规划
//申请一个同样长度的dp表
//dp[i]的含义为以i为结尾的最长有效长度是多少
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
cin>>str;
int len=-1;
int *dp=new int[str.size()-1];
dp[0]=0;
for(int i=1;i<str.size();i++){
if(str[i]=='('){//以(结尾的长度必定为0
dp[i]=0;
}
else{//如果dp[i]=')'
if(str[i-1]=='('){//此时正好能凑出来一对括号
dp[i]+=2;
dp[i]+=i-2>=0?dp[i-2]:0;
len=len>dp[i]?len:dp[i];
}
else{//此时说明str[i-1]==')'
if(i-dp[i-1]-1>=0){
if(str[i-dp[i-1]-1]=='('){
dp[i]=dp[i]+2+dp[i-1];
dp[i]+=i-dp[i-1]-2>=0?dp[i-dp[i-1]-2]:0;
len=dp[i]>len?dp[i]:len;
}
}
}
}
}
cout<<len<<endl;
return 0;
}
//申请一个同样长度的dp表
//dp[i]的含义为以i为结尾的最长有效长度是多少
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
cin>>str;
int len=-1;
int *dp=new int[str.size()-1];
dp[0]=0;
for(int i=1;i<str.size();i++){
if(str[i]=='('){//以(结尾的长度必定为0
dp[i]=0;
}
else{//如果dp[i]=')'
if(str[i-1]=='('){//此时正好能凑出来一对括号
dp[i]+=2;
dp[i]+=i-2>=0?dp[i-2]:0;
len=len>dp[i]?len:dp[i];
}
else{//此时说明str[i-1]==')'
if(i-dp[i-1]-1>=0){
if(str[i-dp[i-1]-1]=='('){
dp[i]=dp[i]+2+dp[i-1];
dp[i]+=i-dp[i-1]-2>=0?dp[i-dp[i-1]-2]:0;
len=dp[i]>len?dp[i]:len;
}
}
}
}
}
cout<<len<<endl;
return 0;
}