#include <bits/stdc++.h>
using namespace std;
const int MAXN = 220000;
const int MAXM = 2 * MAXN;
const int MAXS = 26;
struct SAM {
  struct Node {
    int nxt[MAXS], par;
    int len, siz;
  } st[MAXM];
  int m, root, lst;
  inline int newNode(int l) {
    int x = ++m;
    memset(st[x].nxt, 0, sizeof st[x].nxt);
    st[x].par = 0;
    st[x].len = l;
    st[x].siz = 0;
    return x;
  }
  void extend(char c, bool k) {
    int x = c - 'a';
    int p = lst, np = newNode(st[p].len + 1);
    lst = np;
    st[np].siz = k;
    while (p && !st[p].nxt[x]) st[p].nxt[x] = np, p = st[p].par;
    if (!p) {
      st[np].par = root;
      return;
    }
    int q = st[p].nxt[x];
    if (st[q].len == st[p].len + 1) {
      st[np].par = q;
      return;
    }
    int nq = newNode(st[p].len + 1);
    memcpy(st[nq].nxt, st[q].nxt, sizeof st[q].nxt);
    st[nq].par = st[q].par;
    st[np].par = st[q].par = nq;
    while (p && st[p].nxt[x] == q) st[p].nxt[x] = nq, p = st[p].par;
  }
  void build(int n, char* s, char* t) {
    static int c[MAXN], d[MAXM];
    m = 0;
    lst = root = newNode(0);
    for (int i = 0; i < n; i++) extend(s[i], t[i] ^ '1');
    memset(c, 0, sizeof c);
    for (int i = 1; i <= m; i++) c[st[i].len]++;
    for (int i = 1; i <= n; i++) c[i] += c[i - 1];
    for (int i = 1; i <= m; i++) d[c[st[i].len]--] = i;
    for (int i = m; i >= 2; i--) st[st[d[i]].par].siz += st[d[i]].siz;
  }
  long long query() {
    long long r = 0;
    for (int i = 1; i <= m; i++) r = max(r, 1ll * st[i].len * st[i].siz);
    return r;
  }
} sam;
char s[MAXN], t[MAXN];
int main() {
  int n;
  scanf("%d", &n);
  scanf("%s%s", s, t);
  sam.build(n, s, t);
  printf("%lld\n", sam.query());
  return 0;
}
