func_code_string: #include <bits/stdc++.h>   using namespace std;   map<string, int> globmap;   int optwin[32000];   int optptsc[32000];   int optptso[32000];   int pts[32000];   map<string, int> hashid;   string hashinv[32000];   void findit(int s) {     if (optwin[s] != -1) {       return;     }     string S = hashinv[s];     string append =  z ;     optwin[s] = 0;     optptsc[s] = 0;     optptso[s] = 1000000000;     bool can = 0;     for (int c =  a ; c <=  z ; c++) {       append[0] = c;       string Snext;       for (int b = 0; b < 2; b++) {         if (b)           Snext = S + append;         else           Snext = append + S;         if (hashid.find(Snext) == hashid.end()) continue;         can = 1;         int snext = hashid[Snext];         findit(snext);         int candwin = !optwin[snext];         int candptsc = pts[snext] + optptso[snext];         int candptso = optptsc[snext];         if (candwin < optwin[s]) continue;         if (candwin > optwin[s]) {           optwin[s] = candwin;           optptsc[s] = candptsc;           optptso[s] = candptso;           continue;         }         if (candptsc < optptsc[s]) continue;         if (candptsc > optptsc[s]) {           optwin[s] = candwin;           optptsc[s] = candptsc;           optptso[s] = candptso;           continue;         }         if (candptso > optptso[s]) continue;         if (candptso < optptso[s]) {           optwin[s] = candwin;           optptsc[s] = candptsc;           optptso[s] = candptso;           continue;         }       }     }     if (!can) {       optwin[s] = 0;       optptsc[s] = 0;       optptso[s] = 0;     }   }   int main() {     int n;     scanf( %d , &n);     map<string, int> globmap;     for (int i = 0; i < n; i++) {       string word;       cin >> word;       map<string, bool> allsubs;       int L = word.size();       for (int i = 0; i < L; i++)         for (int j = i; j < L; j++) allsubs[word.substr(i, j - i + 1)] = 1;       for (map<string, bool>::iterator it = allsubs.begin(); it != allsubs.end();            it++) {         string S = (*it).first;         if (globmap.find(S) == globmap.end())           globmap[S] = 1;         else           globmap[S]++;       }     }     int ct = 0;     for (map<string, int>::iterator it = globmap.begin(); it != globmap.end();          it++) {       string S = (*it).first;       int L = S.size();       int maxx = 0;       int summ = 0;       for (int i = 0; i < L; i++) {         summ += S[i] -  a  + 1;         if (S[i] -  a  + 1 > maxx) maxx = S[i] -  a  + 1;       }       (*it).second += summ * maxx;       hashid[S] = ct + 1;       hashinv[ct + 1] = S;       pts[ct + 1] = (*it).second;       ct++;     }     hashid[  ] = 0;     hashinv[0] =   ;     pts[0] = 0;     ct++;     for (int i = 0; i < ct; i++) {       optwin[i] = -1;       optptsc[i] = -1;       optptso[i] = -1;     }     findit(0);     if (optwin[0])       printf( First n );     else       printf( Second n );     printf( %d %d n , optptsc[0], optptso[0]);   }   