func_code_string: #include <bits/stdc++.h>   using namespace std;   const int M = 100004;   unordered_map<string, int> mp;   unordered_set<int> st[M];   vector<int> g[M];   string s[M];   int m = 0;   int getid(string &t) {     if (mp.count(t))       return mp[t];     else {       s[++m] = t;       return mp[t] = m;     }   }   int val[M];   struct P {     int v, s0, s1;   } sv[M];   P dfs(int u, int p) {     if (g[u].empty())       return P{p, 0, 0};     else if (sv[u].v != -1)       return sv[u];     P win = P{-1, -1, -1}, lose = P{-1, -1, -1};     for (int v : g[u]) {       P nw = dfs(v, p ^ 1);       int s0 = nw.s0, s1 = nw.s1;       if (p == 0) {         s0 += val[v];         if (nw.v == 1 && (s0 > win.s0 || s0 == win.s0 && s1 < win.s1))           win = P{1, s0, s1};         if (nw.v == 0 && (s0 > lose.s0 || s0 == lose.s0 && s1 < lose.s1))           lose = P{0, s0, s1};       } else {         s1 += val[v];         if (nw.v == 0 && (s1 > win.s1 || s1 == win.s1 && s0 < win.s0))           win = P{0, s0, s1};         if (nw.v == 1 && (s1 > lose.s1 || s1 == lose.s1 && s0 < lose.s0))           lose = P{1, s0, s1};       }     }     if (win.v != -1)       return sv[u] = win;     else       return sv[u] = lose;   }   int main() {     int n;     memset(sv, -1, sizeof(sv));     cin >> n;     string t;     for (int i = 0; i < n; i++) {       cin >> t;       for (int j = 0; j < t.size(); j++) {         string u =   ;         for (int k = j; k < t.size(); k++) {           u += t[k];           int x = getid(u);           st[x].insert(i);         }       }     }     for (int i = 0; i <= m; i++) {       for (char ch =  a ; ch <=  z ; ch++) {         string t = s[i] + ch;         if (mp.count(t)) {           int x = mp[t];           g[i].push_back(x);         }         t = string(  ) + ch + s[i];         if (mp.count(t)) {           int x = mp[t];           g[i].push_back(x);         }       }       int sum = 0, mx = 0;       for (char ch : s[i]) {         int x = ch -  a  + 1;         mx = max(mx, x);         sum += x;       }       val[i] = sum * mx + st[i].size();     }     P p = dfs(0, 0);     puts(p.v ?  First  :  Second );     printf( %d %d n , p.s0, p.s1);   }   