// editor1
#include <stdio.h>
#include <string.h>

int main() {
    int n;
    char glyph[100001];
    
    // Read n
    if (scanf("%d", &n) != 1) {
        printf("Invalid input\n");
        return 0;
    }
    
    // Validate n constraints
    if (n < 1 || n > 100000) {
        printf("Invalid input\n");
        return 0;
    }
    
    // Read the glyph string
    if (scanf("%s", glyph) != 1) {
        printf("Invalid input\n");
        return 0;
    }
    
    // Check if string length matches n
    if (strlen(glyph) != n) {
        printf("Invalid input\n");
        return 0;
    }
    
    // Validate that string contains only '(' and ')'
    for (int i = 0; i < n; i++) {
        if (glyph[i] != '(' && glyph[i] != ')') {
            printf("Invalid input\n");
            return 0;
        }
    }
    
    // Find longest balanced parentheses chain using dynamic programming
    // dp[i] represents the length of longest valid parentheses ending at index i
    int dp[100001] = {0};
    int maxLen = 0;
    
    for (int i = 1; i < n; i++) {
        if (glyph[i] == ')') {
            if (glyph[i-1] == '(') {
                // Case: ...()
                dp[i] = (i >= 2 ? dp[i-2] : 0) + 2;
            }
            else if (dp[i-1] > 0) {
                // Case: ...))
                int matchIndex = i - dp[i-1] - 1;
                if (matchIndex >= 0 && glyph[matchIndex] == '(') {
                    dp[i] = dp[i-1] + 2 + (matchIndex > 0 ? dp[matchIndex-1] : 0);
                }
            }
        }
        maxLen = (dp[i] > maxLen) ? dp[i] : maxLen;
    }
    
    printf("%d\n", maxLen);
    return 0;
}