fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define FOR(i,l,r) for (int i = l; i <= r; ++i)
  5. #define FOD(i,r,l) for (int i = r; i >= l; --i)
  6. #define ll long long
  7. #define ld long double
  8.  
  9. int k;
  10. int f[(int)5e5 + 10][28];
  11. int d[28], dl[28], dr[28], s[28], sl[28], sr[28];
  12. string str;
  13.  
  14. bool ok(int x) {
  15. FOR(i, x, str.size()) {
  16. FOR(j, 1, 26) {
  17. d[j] = f[i][j] - f[i - x][j];
  18. s[j] = d[j] * j;
  19.  
  20. dl[j] = dl[j - 1] + d[j];
  21. sl[j] = sl[j - 1] + s[j];
  22. }
  23. FOD(j, 26, 1) {
  24. dr[j] = dr[j + 1] + d[j];
  25. sr[j] = sr[j + 1] + s[j];
  26. }
  27.  
  28. int mn = 1e9;
  29. FOR(i, 1, 26) {
  30. mn = min(mn, dl[i - 1] * i - sl[i - 1] + sr[i + 1] - dr[i + 1] * i);
  31. }
  32. if (mn <= k) return true;
  33. }
  34. return 0;
  35. }
  36.  
  37. int main() {
  38. ios_base::sync_with_stdio(false);
  39. cin.tie(NULL);
  40. cout.tie(NULL);
  41.  
  42. if (fopen("PLAN.inp", "r")) {
  43. freopen("PLAN.inp", "r", stdin);
  44. freopen("PLAN.out", "w", stdout);
  45. }
  46.  
  47. cin >> k >> str;
  48.  
  49. FOR(i, 1, str.size()) {
  50. FOR(j, 1, 26) {
  51. f[i][j] = f[i - 1][j];
  52. }
  53. f[i][str[i - 1] - 'a' + 1]++;
  54. }
  55.  
  56. int l = 1, r = str.size(), res = 1;
  57. while (l <= r) {
  58. int mid = l + r >> 1;
  59. if (ok(mid)) {
  60. res = max(res, mid);
  61. l = mid + 1;
  62. }
  63. else {
  64. r = mid - 1;
  65. }
  66. }
  67. cout << res;
  68. }
  69.  
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
1