Advertisement
Guest User

Untitled

a guest
Nov 19th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <bitset>
  3. #include <algorithm>
  4. #include <memory.h>
  5. #include <utility>
  6. #include <vector>
  7. #include <deque>
  8.  
  9. #define ll long long
  10.  
  11. using namespace std;
  12.  
  13. const int N = (int)5e5 + 7;
  14.  
  15. int mod = (int)1e9 + 7;
  16. int p = 997;
  17.  
  18. int mult(int a, int b) {
  19.     return (a * 1LL * b) % mod;
  20. }
  21.  
  22. int add(int a, int b) {
  23.     return (a + b) % mod;
  24. }
  25.  
  26. int h[N];
  27. int pw[N];
  28. int n, k;
  29. string s;
  30.  
  31. int get(int l, int r) {
  32.     return add(h[r], mod - mult(h[l - 1], pw[r - l + 1]));
  33. }
  34.  
  35. bool bigger(int i1, int i2) {
  36.     int l = -1;
  37.     int r = n - k + 1;
  38.     while (r - l > 1) {
  39.         int mid = (l + r) >> 1;
  40.         if (get(i1, i1 + mid) == get(i2, i2 + mid)) {
  41.             l = mid;
  42.         } else {
  43.             r = mid;
  44.         }
  45.     }
  46.     if (l == n - k) {
  47.         return 0;
  48.     } else {
  49.         //cout << s[i1 + r] << ' ' << s[i2 + r] << endl;
  50.         return (s[i1 + r] > s[i2 + r]);
  51.     }
  52. }
  53.  
  54. string addstring(string a, string b) {
  55.     string res;
  56.     if (a.size() > b.size()) {
  57.         swap(a, b);
  58.     }
  59.     reverse(a.begin(), a.end());
  60.     while (a.size() < b.size()) {
  61.         a.push_back('0');
  62.     }
  63.     reverse(a.begin(), a.end());
  64.     int carry = 0;
  65.     for (int i = 0; i < a.size(); i++) {
  66.         res.push_back('0');
  67.     }
  68.     for (int i = a.size() - 1; i >= 0; i--) {
  69.         carry += (a[i] - '0') + (b[i] - '0');
  70.         res[i] = '0' + (carry % 10);
  71.         carry /= 10;
  72.     }
  73.     if (carry) {
  74.         res = char(carry + '0') + res;
  75.     }
  76.     return res;
  77. }
  78.  
  79. main() {
  80.     ios::sync_with_stdio(0);
  81.     cin.tie(0);
  82.     //
  83.     pw[0] = 1;
  84.     for (int i = 1; i < N; i++) {
  85.         pw[i] = mult(pw[i - 1], p);
  86.     }
  87.     cin >> n >> k;
  88.     cin >> s;
  89.     int cur = 0;
  90.     while (s[cur] == '0') {
  91.         cur++;
  92.         k--;
  93.         n--;
  94.     }
  95.     s.erase(0, cur);
  96.     s = " " + s;
  97.     for (int i = 1; i <= n; i++) {
  98.         h[i] = add(mult(h[i - 1], p), s[i]);
  99.     }
  100.     int mx = 1;
  101.     for (int i = 2; i + (n - k) <= n; i++) {
  102.         //cout << i << endl;
  103.         if (bigger(i, mx)) {
  104.             mx = i;
  105.         }
  106.     }
  107.     int sum = 0;
  108.     for (int i = 1; i <= n; i++) {
  109.         if (mx <= i && i <= mx + (n - k)) {
  110.             continue;
  111.         }
  112.         sum += (s[i] - '0');
  113.     }
  114.     string a1, a2;
  115.     for (int i = mx; i <= mx + (n - k); i++) {
  116.         a1.push_back(s[i]);
  117.     }
  118.     while (sum > 0) {
  119.         a2.push_back('0' + sum % 10);
  120.         sum /= 10;
  121.     }
  122.     reverse(a2.begin(), a2.end());
  123.     cout << addstring(a1, a2);
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement