Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <bitset>
- #include <algorithm>
- #include <memory.h>
- #include <utility>
- #include <vector>
- #include <deque>
- #define ll long long
- using namespace std;
- const int N = (int)5e5 + 7;
- int mod = (int)1e9 + 7;
- int p = 997;
- int mult(int a, int b) {
- return (a * 1LL * b) % mod;
- }
- int add(int a, int b) {
- return (a + b) % mod;
- }
- int h[N];
- int pw[N];
- int n, k;
- string s;
- int get(int l, int r) {
- return add(h[r], mod - mult(h[l - 1], pw[r - l + 1]));
- }
- bool bigger(int i1, int i2) {
- int l = -1;
- int r = n - k + 1;
- while (r - l > 1) {
- int mid = (l + r) >> 1;
- if (get(i1, i1 + mid) == get(i2, i2 + mid)) {
- l = mid;
- } else {
- r = mid;
- }
- }
- if (l == n - k) {
- return 0;
- } else {
- //cout << s[i1 + r] << ' ' << s[i2 + r] << endl;
- return (s[i1 + r] > s[i2 + r]);
- }
- }
- string addstring(string a, string b) {
- string res;
- if (a.size() > b.size()) {
- swap(a, b);
- }
- reverse(a.begin(), a.end());
- while (a.size() < b.size()) {
- a.push_back('0');
- }
- reverse(a.begin(), a.end());
- int carry = 0;
- for (int i = 0; i < a.size(); i++) {
- res.push_back('0');
- }
- for (int i = a.size() - 1; i >= 0; i--) {
- carry += (a[i] - '0') + (b[i] - '0');
- res[i] = '0' + (carry % 10);
- carry /= 10;
- }
- if (carry) {
- res = char(carry + '0') + res;
- }
- return res;
- }
- main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- //
- pw[0] = 1;
- for (int i = 1; i < N; i++) {
- pw[i] = mult(pw[i - 1], p);
- }
- cin >> n >> k;
- cin >> s;
- int cur = 0;
- while (s[cur] == '0') {
- cur++;
- k--;
- n--;
- }
- s.erase(0, cur);
- s = " " + s;
- for (int i = 1; i <= n; i++) {
- h[i] = add(mult(h[i - 1], p), s[i]);
- }
- int mx = 1;
- for (int i = 2; i + (n - k) <= n; i++) {
- //cout << i << endl;
- if (bigger(i, mx)) {
- mx = i;
- }
- }
- int sum = 0;
- for (int i = 1; i <= n; i++) {
- if (mx <= i && i <= mx + (n - k)) {
- continue;
- }
- sum += (s[i] - '0');
- }
- string a1, a2;
- for (int i = mx; i <= mx + (n - k); i++) {
- a1.push_back(s[i]);
- }
- while (sum > 0) {
- a2.push_back('0' + sum % 10);
- sum /= 10;
- }
- reverse(a2.begin(), a2.end());
- cout << addstring(a1, a2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement