func_code_string: #include <bits/stdc++.h>   using namespace std;   int stop, n, k, x, i, ind, j, y[1000001], mini[2001][2001];   string s[2001];   struct name {     int a[26];     int cnt;   } trie[1000001];   vector<int> d[1000001];   int m;   void add(int v, int pos) {     if (pos > s[i].length()) return;     if (trie[v].a[s[i][pos] -  a ])       add(trie[v].a[s[i][pos] -  a ], pos + 1);     else {       m++;       trie[v].a[s[i][pos] -  a ] = m;       add(m, pos + 1);     };     trie[v].cnt++;   }   void dp(int v) {     for (int j = 0; j < 26; j++)       if (trie[v].a[j]) dp(trie[v].a[j]);     d[v].resize(trie[v].cnt + 1);     for (int j = 0; j < 26; j++) {       int p = trie[v].a[j];       if (p == 0) continue;       int s = d[p].size() - 1;       for (int k1 = d[v].size() - s - 1; k1 >= 0; k1--)         for (int i = 1; i <= s; i++) {           d[v][k1 + i] = max(d[v][k1 + i], d[v][k1] + d[p][i] + i * (i - 1) / 2);         }     }   }   int main() {     cin >> n >> k;     for (i = 1; i <= n; i++) {       cin >> s[i];       add(0, 0);     };     dp(0);     cout << d[0][k];     return 0;   }   