func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 5010;   struct SA {     bool _t[N * 2];     int _s[N * 2], _sa[N * 2], _c[N * 2], x[N], _p[N], _q[N * 2], hei[N], r[N];     int operator[](int i) { return _sa[i]; }     void build(int *s, int n, int m) {       memcpy(_s, s, sizeof(int) * n);       sais(_s, _sa, _p, _q, _t, _c, n, m);       mkhei(n);     }     void mkhei(int n) {       for (int i = 0; i < int(n); i++) r[_sa[i]] = i;       hei[0] = 0;       for (int i = 0; i < int(n); i++)         if (r[i]) {           int ans = i > 0 ? max(hei[r[i - 1]] - 1, 0) : 0;           while (_s[i + ans] == _s[_sa[r[i] - 1] + ans]) ans++;           hei[r[i]] = ans;         }     }     void sais(int *s, int *sa, int *p, int *q, bool *t, int *c, int n, int z) {       bool uniq = t[n - 1] = true, neq;       int nn = 0, nmxz = -1, *nsa = sa + n, *ns = s + n, lst = -1;       memset((c), 0, z * sizeof(*(c)));       for (int i = 0; i < int(n); i++) uniq &= ++c[s[i]] < 2;       for (int i = 0; i < int(z - 1); i++) c[i + 1] += c[i];       if (uniq) {         for (int i = 0; i < int(n); i++) sa[--c[s[i]]] = i;         return;       }       for (int i = n - 2; i >= 0; i--)         t[i] = (s[i] == s[i + 1] ? t[i + 1] : s[i] < s[i + 1]);       memset((sa), 0, n * sizeof(*(sa)));       memcpy(x, c, sizeof(int) * z);       for (int i = (1); i <= int(n - 1); i++)         if (t[i] && !t[i - 1]) sa[--x[s[i]]] = p[q[i] = nn++] = i;       memcpy(x + 1, c, sizeof(int) * (z - 1));       for (int i = 0; i < int(n); i++)         if (sa[i] && !t[sa[i] - 1]) sa[x[s[sa[i] - 1]]++] = sa[i] - 1;       memcpy(x, c, sizeof(int) * z);       for (int i = n - 1; i >= 0; i--)         if (sa[i] && t[sa[i] - 1]) sa[--x[s[sa[i] - 1]]] = sa[i] - 1;       ;       for (int i = 0; i < int(n); i++)         if (sa[i] && t[sa[i]] && !t[sa[i] - 1]) {           neq = lst < 0 || memcmp(s + sa[i], s + lst,                                   (p[q[sa[i]] + 1] - sa[i]) * sizeof(int));           ns[q[lst = sa[i]]] = nmxz += neq;         }       sais(ns, nsa, p + nn, q + n, t + n, c + z, nn, nmxz + 1);       memset((sa), 0, n * sizeof(*(sa)));       memcpy(x, c, sizeof(int) * z);       for (int i = nn - 1; i >= 0; i--) sa[--x[s[p[nsa[i]]]]] = p[nsa[i]];       memcpy(x + 1, c, sizeof(int) * (z - 1));       for (int i = 0; i < int(n); i++)         if (sa[i] && !t[sa[i] - 1]) sa[x[s[sa[i] - 1]]++] = sa[i] - 1;       memcpy(x, c, sizeof(int) * z);       for (int i = n - 1; i >= 0; i--)         if (sa[i] && t[sa[i] - 1]) sa[--x[s[sa[i] - 1]]] = sa[i] - 1;       ;     }   } sa;   int H[N], SA[N];   void suffix_array(int *ip, int len) {     ip[len++] = 0;     sa.build(ip, len, 128);     for (int i = 0; i < len; i++) {       H[i] = sa.hei[i + 1];       SA[i] = sa._sa[i + 1];     }   }   int n, k, v[N];   char c[N];   void init() {     scanf( %s , c);     scanf( %d , &k);     n = strlen(c);     for (int i = 0; i < n; i++) v[i] = c[i] -  a  + 1;     v[n] = 0;     suffix_array(v, n);   }   bool gt[N][N], pp[N][N];   bool go(int l, int r) {     if (l > r) return true;     if (gt[l][r]) return pp[l][r];     gt[l][r] = true;     if (c[l] != c[r]) return false;     return pp[l][r] = go(l + 2, r - 2);   }   void solve() {     for (int i = 0; i < n; i++)       for (int j = i; j < n; j++) go(i, j);     for (int i = 0; i < n; i++)       for (int j = H[i]; SA[i] + j < n; j++) {         if (!pp[SA[i]][SA[i] + j]) continue;         int tlen = j + 1;         for (int ii = i; ii < n; ii++) {           if (ii > i) tlen = min(tlen, H[ii]);           if (tlen < j + 1) break;           k--;           if (k == 0) {             for (int u = SA[i]; u <= SA[i] + j; u++) putchar(c[u]);             puts(  );             exit(0);           }         }       }   }   int main() {     init();     solve();   }   