func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, k;   int Time = 0;   string s;   bool dp[2][(int)1e5 + 10];   struct Node {     int nxt[26];     bool leaf;     Node() {       for (int i = 0; i < 26; i++) nxt[i] = -1;       leaf = 1;     }   } trie[(int)1e5 + 10];   void dodaj(string s) {     int niz[100010];     for (int i = 0; i < s.size(); i++) niz[i] = s[i] -  a ;     int tr = 0;     for (int i = 0; i < s.size(); i++) {       if (trie[tr].nxt[niz[i]] == -1) trie[tr].nxt[niz[i]] = ++Time;       trie[tr].leaf = 0;       tr = trie[tr].nxt[niz[i]];     }   }   bool uradi0(int tr, bool minn) {     if (trie[tr].leaf) {       dp[0][tr] = 1;       return 1;     }     for (int i = 0; i < 26; i++) {       if (trie[tr].nxt[i] != -1) minn = min(minn, uradi0(trie[tr].nxt[i], 1));     }     dp[0][tr] = 1 ^ minn;     return dp[0][tr];   }   bool uradi1(int tr, bool minn) {     if (trie[tr].leaf) {       dp[1][tr] = 0;       return 0;     }     for (int i = 0; i < 26; i++) {       if (trie[tr].nxt[i] != -1) minn = min(minn, uradi1(trie[tr].nxt[i], 1));     }     dp[1][tr] = 1 ^ minn;     return dp[1][tr];   }   int main() {     cin >> n >> k;     for (int i = 0; i < n; i++) {       cin >> s;       dodaj(s);     }     uradi0(0, 1);     uradi1(0, 1);     if (dp[0][0] == 1 && dp[1][0] == 1)       cout <<  First  << endl;     else if (dp[0][0] == 1)       cout <<  Second  << endl;     else if (dp[1][0] == 1)       cout << ((k % 2 == 1) ?  First  :  Second ) << endl;     else       cout <<  Second  << endl;   }   