Advertisement
jrke

Untitled

May 31st, 2025
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. // jrke's special
  2. // Codeforces - 2025 ICPC Nanchang Invitational and Jiangxi Provincial Collegiate Programming Contest/E_Gods_String_on_This_Wonderful_World.cpp
  3. // Codeforces
  4.  
  5.  
  6. #include <bits/stdc++.h>
  7.  
  8. using namespace std;
  9.  
  10. #define ll int
  11.  
  12. //definition
  13. void solveTest();
  14.  
  15. int main() {
  16. ios_base::sync_with_stdio(false);
  17. cin.tie(nullptr);
  18.  
  19. //judgeio();
  20. // int t;
  21. // cin >> t; cin.ignore();
  22. //
  23. // for (int i = 0; i < t; i++) solveTest();
  24. solveTest();
  25.  
  26. return 0;
  27. }
  28.  
  29. //solving a test case
  30. void solveTest() {
  31. ll n, k, q;
  32. cin >> n >> k >> q; cin.ignore();
  33. ll blockSize = sqrt(n);
  34.  
  35. string s;
  36. cin >> s;
  37. vector<pair<ll, pair<ll, ll>>> v;
  38. for (ll i = 0; i < q; i++) {
  39. ll a, b;
  40. cin >> a >> b;
  41. a--, b--;
  42. v.push_back({a, {b, i}});
  43. }
  44. sort(v.begin(), v.end());
  45.  
  46. vector<ll> state(n + 1);
  47. map<vector<ll>, ll> tt;
  48. vector<ll> freq(26);
  49. ll st = 1;
  50.  
  51. for (ll i = 0; i <= n; i++) {
  52. if (tt[freq] == 0) tt[freq] = st++;
  53. state[i] = tt[freq];
  54. if (i == n) break;
  55. freq[s[i] - 'a']++;
  56. freq[s[i] - 'a'] %= k;
  57. }
  58.  
  59. vector<ll> ans(q);
  60. ll idx = 0;
  61. ll block = 0;
  62. vector<ll> cnt(st);
  63.  
  64. while (idx < v.size()) {
  65.  
  66. ll start = block * blockSize;
  67. vector<pair<ll, pair<ll, ll>>> b;
  68.  
  69. for (ll i = start; i < start + blockSize; i++) {
  70. while (idx < v.size() && v[idx].first == i) {
  71. b.push_back({v[idx].second.first, {v[idx].first, v[idx].second.second}});
  72. idx++;
  73. }
  74. }
  75.  
  76. sort(b.begin(), b.end());
  77. vector<ll> rem;
  78. ll currl = start;
  79. ll currr = start;
  80. ll currAns = 0;
  81.  
  82. for (ll i = 0; i < b.size(); i++) {
  83. ll l = b[i].second.first;
  84. ll r = b[i].first;
  85.  
  86. while (currr <= r + 1) {
  87. currAns += cnt[state[currr]];
  88. rem.push_back(state[currr]);
  89. cnt[state[currr++]]++;
  90. }
  91.  
  92. if (currl > l) {
  93. while (currl != l) {
  94. currl--;
  95. currAns += cnt[state[currl]];
  96. cnt[state[currl]]++;
  97. }
  98. } else {
  99. while (currl != l) {
  100. cnt[state[currl]]--;
  101. currAns -= cnt[state[currl]];
  102. currl++;
  103. }
  104. }
  105. ans[b[i].second.second] = currAns;
  106. }
  107.  
  108. block++;
  109. for (ll x : rem) cnt[x] = 0;
  110. }
  111.  
  112. for (int i = 0; i < q; i++) cout << ans[i] << endl;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement