#include <bits/stdc++.h>
using namespace std;
void file() { freopen("equations.in", "r", stdin); }
const int MAX = 1e5 + 10, mod = 1e9 + 7;
int main() {
  int n, ans = 0;
  cin >> n;
  string s[n];
  map<string, int> m;
  for (int i = 0; i < n; ++i) {
    cin >> s[i];
    stack<char> st;
    string str = "";
    for (int j = 0; j < s[i].size(); ++j) {
      if (s[i][j] == '(')
        st.push(s[i][j]);
      else if (!st.empty())
        st.pop();
      else
        str += s[i][j];
    }
    while (!st.empty()) {
      str += st.top();
      st.pop();
    }
    s[i] = str;
    if (str.size())
      ++m[str];
    else
      ++m["**"];
  }
  for (int i = 0; i < n; ++i) {
    string str = "";
    int c = 0;
    for (int j = s[i].size() - 1; j >= 0; --j) {
      if (s[i][j] == ')')
        str += '(';
      else
        str += ')';
    }
    stack<char> st;
    string tmp = str + s[i];
    for (int j = 0; j < tmp.size(); ++j) {
      if (tmp[j] == '(')
        st.push(tmp[j]);
      else if (!st.empty()) {
        st.pop();
        ++c;
      }
    }
    if (2 * c == tmp.size() && m[str]) {
      ++ans, --m[str];
    } else {
      c = 0;
      tmp = s[i] + str;
      stack<char> st;
      for (int j = 0; j < tmp.size(); ++j) {
        if (tmp[j] == '(')
          st.push(tmp[j]);
        else if (!st.empty()) {
          st.pop();
          ++c;
        }
      }
      if (2 * c == tmp.size() && m[str]) {
        ++ans, --m[str];
      }
    }
  }
  cout << ans / 2 + m["**"] / 2;
  return 0;
}
