func_code_string: #include <bits/stdc++.h>   using namespace std;   const long inf = 1000000000;   long n, nn;   long d[40000][100];   long dem[40000];   long tong[40000];   long lon[40000];   long canh[40000][30][2];   long res[40000], kq, mot, hai, ans[40000], cans[40000];   string x, s[40], y;   vector<string> chuoi;   long max(long a, long b) {     if (a > b) return a;     return b;   }   long nap(long u, char v) {     if (d[u][v -  a ]) return d[u][v -  a ];     d[u][v -  a ] = ++nn;     tong[nn] = tong[u] + v -  a  + 1;     lon[nn] = max(v -  a  + 1, lon[u]);     return d[u][v -  a ];   }   void push(string &s) {     long u = 0;     for (long i = 0; i <= s.length() - 1; i++) u = nap(u, s[i]);     dem[u]++;   }   long get(string &s) {     long u = 0;     for (long i = 0; i <= s.length() - 1; i++) {       u = d[u][s[i] -  a ];       if (!u) return u;     }     return u;   }   long dp(long u) {     if (res[u] != -inf) return res[u];     res[u] = -1;     for (long t = 0; t <= 1; t++)       for (long i = 0; i <= 25; i++)         if (canh[u][i][t]) {           long v = canh[u][i][t];           res[u] = max(dp(v), res[u]);         }     res[u] *= -1;     return res[u];   }   void qhd(long u) {     if (ans[u] != -inf) return;     long cost = tong[u] * lon[u] + dem[u];     ans[u] = -1;     cans[u] = -1;     for (long t = 0; t <= 1; t++)       for (long i = 0; i <= 25; i++)         if (canh[u][i][t]) {           long v = canh[u][i][t];           if (res[u] == res[v]) continue;           qhd(v);           if (ans[v] > cans[u]) {             cans[u] = ans[v];             ans[u] = cans[v];           } else if (cans[u] == ans[v] && ans[u] > cans[v])             ans[u] = cans[v];         }     if (ans[u] == -1) ans[u] = 0;     if (cans[u] == -1) cans[u] = 0;     ans[u] += cost;   }   int main() {     cin >> n;     for (long i = 1; i <= n; i++) {       cin >> s[i];       chuoi.clear();       for (long d = s[i].length(); d >= 1; d--) {         for (long u = 0; u <= s[i].length() - d; u++) {           x = s[i].substr(u, d);           chuoi.push_back(x);         }       }       sort(chuoi.begin(), chuoi.end());       push(chuoi[0]);       for (long i = 1; i <= chuoi.size() - 1; i++)         if (chuoi[i] != chuoi[i - 1]) push(chuoi[i]);     }     for (long i = 1; i <= n; i++) {       string ss = s[i];       for (long d = ss.length() - 1; d >= 1; d--) {         for (long u = 0; u <= ss.length() - d; u++) {           long v = u + d - 1;           x = ss.substr(u, d);           long t = get(x);           if (v + 1 < ss.length() && !canh[t][ss[v + 1] -  a ][0]) {             y = ss.substr(u, d + 1);             long tt = get(y);             canh[t][ss[v + 1] -  a ][0] = tt;           }           if (u > 0 && !canh[t][ss[u - 1] -  a ][1]) {             y = ss.substr(u - 1, d + 1);             long tt = get(y);             canh[t][ss[u - 1] -  a ][1] = tt;           }         }       }     }     for (long i = 1; i <= nn; i++) res[i] = -inf;     kq = -1;     for (char c =  a ; c <=  z ; c++) {       x = c;       long u = get(x);       if (!u) continue;       kq = max(dp(u), kq);     }     if (kq == 1)       cout <<  First  << endl;     else       cout <<  Second  << endl;     for (long i = 1; i <= nn; i++) ans[i] = -inf;     long tl = -inf;     long tll;     for (char c =  a ; c <=  z ; c++) {       x = c;       long u = get(x);       if (!u) continue;       if (res[u] != kq) continue;       qhd(u);       long t = ans[u];       if (t > tl) {         tl = t;         tll = cans[u];       } else if (t == tl && cans[u] < tll)         tll = cans[u];     }     cout << tl <<     << tll << endl;     return 0;   }   