func_code_string: #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;   }   