#include <bits/stdc++.h>
using namespace std;
const int md = 1e9 + 7;
const long long inf64 = 1e18;
int sz = 1;
vector<pair<int, int>> tr;
vector<int> ps;
pair<int, int> merge(pair<int, int> &a, pair<int, int> &b) {
  if (a.first < b.first) return a;
  if (a.first > b.first) return b;
  return {a.first, a.second + b.second};
}
void build(int v, int l, int r, int bg, int en) {
  if (bg >= r || l >= en) return;
  if (r - l == 1) {
    tr[v] = {0, r - l};
    return;
  }
  int m = (l + r) >> 1;
  build(v << 1, l, m, bg, en);
  build(v << 1 | 1, m, r, bg, en);
  tr[v] = merge(tr[v << 1], tr[v << 1 | 1]);
}
void push(int v, int l, int r) {
  ps[v << 1] += ps[v];
  ps[v << 1 | 1] += ps[v];
  tr[v << 1].first += ps[v];
  tr[v << 1 | 1].first += ps[v];
  ps[v] = 0;
}
void add(int v, int l, int r, int bg, int en, int val) {
  if (bg >= r || l >= en) return;
  if (l >= bg && r <= en) {
    ps[v] += val;
    tr[v].first += val;
    return;
  }
  push(v, l, r);
  int m = (l + r) >> 1;
  add(v << 1, l, m, bg, en, val), add(v << 1 | 1, m, r, bg, en, val);
  tr[v] = merge(tr[v << 1], tr[v << 1 | 1]);
}
vector<int> v;
unordered_map<int, int> cn, l, r;
unordered_map<int, set<int>> whr;
void modify(int i, int old, int nw) {
  if (old != -1) {
    whr[old].erase(i);
    cn[old]--;
    if (cn[old] == 0)
      cn.erase(old);
    else {
      l[old] = *whr[old].begin();
      r[old] = *whr[old].rbegin();
    }
  }
  whr[nw].insert(i);
  cn[nw]++;
  l[nw] = *whr[nw].begin();
  r[nw] = *whr[nw].rbegin();
  v[i] = nw;
}
void change(int i, int x) {
  int old = v[i];
  if (old != -1) add(1, 0, sz, l[old], r[old], -1);
  if (cn.count(x)) add(1, 0, sz, l[x], r[x], -1);
  modify(i, old, x);
  if (old != -1) add(1, 0, sz, l[old], r[old], 1);
  if (cn.count(x)) add(1, 0, sz, l[x], r[x], 1);
}
int main() {
  iostream::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int n;
  cin >> n;
  vector<int> a(n), b(n);
  vector<int> on(n);
  for (int i = 0; i < n; i++) {
    char c;
    cin >> c;
    on[i] = c - '0';
  }
  for (int i = 0; i < n; i++) cin >> a[i] >> b[i];
  int mx = 0;
  for (int i = 0; i < 1e6; i++) {
    int cur = 0;
    for (int j = 0; j < n; j++) {
      if (on[j]) cur++;
      if (i + 1 >= b[j] && (i + 1 - b[j]) % a[j] == 0) on[j] ^= true;
    }
    mx = max(mx, cur);
  }
  cout << mx << '\n';
  return 0;
}
