func_code_string: #include<bits/stdc++.h>   #define X first   #define Y second   #define sz(a) (int)a.size()   #define ll long long   //#define int long long   using namespace std;   const int mod = 1e9 + 7;   const int N = 3e5;      signed main()   {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);       int n, k;       cin >> n >> k;       string s;       cin >> s;       vector <int> vec;       for(int i = 0; i < n; i++)       {           if(s[i] ==  ? )           {               vec.push_back(-1);           }           else           {               vec.push_back(s[i] -  a );           }       }       vector <vector <int> > right(k, vector <int> (n, 0));       for(int i = 0; i < k; i++)       {           for(int j = n - 1; j >= 0; j--)           {               if(vec[j] == i || vec[j] == -1)               {                   if(j == n - 1)                   {                       right[i][j] = 1;                   }                   else                   {                       right[i][j] = right[i][j + 1] + 1;                   }               }      //         cout << right[i][j] <<    ;           }        //   cout <<   n ;       }       int l = 0, r = n + 1;       while(r - l > 1)       {           int midd = (r + l) / 2;           vector <vector <int> > mass(26);           for(int i = 0; i < k; i++)           {               for(int j = 0; j < n; j++)               {                   if(right[i][j] >= midd)                   {                       mass[i].push_back(j);                   }               }           }           vector <int> dp(1 << k, 1e9);           dp[0] = -1;           vector <int> iter(k, 0);           vector <vector <int> > mass1(n + 1);           mass1[0].push_back(0);           for(int i = 0; i < n; i++)           {               for(int j = 0; j < k; j++)               {                   while(iter[j] < sz(mass[j]) && mass[j][iter[j]] < i)                   {                       iter[j]++;                   }               }               for(auto p : mass1[i])               {                   if(dp[p] != i - 1)                   {                       continue;                   }                   for(int j = 0; j < k; j++)                   {                       if((1 << j) & p)                       {                           continue;                       }                       if(iter[j] < sz(mass[j]))                       {                           int u = mass[j][iter[j]];                           if(dp[(1 << j) | p] > u + midd - 1)                           {                               dp[(1 << j) | p] = u + midd - 1;                               mass1[u + midd].push_back((1 << j) | p);                           }                       }                   }               }           }           if(dp[(1 << k) - 1] < n)           {               l = midd;           }           else           {               r = midd;           }       }       cout << l;       return 0;   }   