Advertisement
Tainel

ICPC Regional 2023 L

Mar 22nd, 2023 (edited)
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.83 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define forr(i,l,r) for(int i=int(l);i<int(r);++i)
  6. #define sz(c) (int((c).size()))
  7.  
  8. int longest_repetition(const string_view& word, const int d) {
  9.     const int n = sz(word);
  10.     vector<int> z = {0};
  11.     int m = min(d, n), l = 0, r = 0;
  12.     forr(i, 1, min(d + 1, n)) {
  13.         z.push_back(0);
  14.         if (i <= r) {z[i] = min(r - i + 1, z[i - l]);}
  15.         while (i + z[i] < n && word[z[i]] == word[i + z[i]]) {++z[i];}
  16.         if (i + z[i] - 1 > r) {l = i, r = i + z[i] - 1;}
  17.         m = max(m, i + z[i]);
  18.     }
  19.     return m;
  20. }
  21.  
  22. void solve() {
  23.     string s;
  24.     cin>>s;
  25.     int d;
  26.     cin>>d;
  27.     string_view word = s;
  28.     int ans = 0;
  29.     while (!word.empty()) {
  30.         ++ans;
  31.         word.remove_prefix(longest_repetition(word, d));
  32.     }
  33.     cout<<ans<<'\n';
  34. }
  35.  
  36. int main() {
  37.     ios_base::sync_with_stdio(false);
  38.     cin.tie(nullptr);
  39.     solve();
  40. }
  41.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement