fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define pb push_back
  5. #define all(a) begin(a),end(a)
  6. using vi = vector<int>;
  7. using ll = long long;
  8.  
  9. const int mxN = (int)1e5;
  10. const int B = 300;
  11.  
  12. vi v;
  13. string s;
  14. int n, q;
  15. ll sum, ans[mxN];
  16. int l[mxN], r[mxN], a[mxN], cnt[1<<26];
  17.  
  18. void add(int i){
  19. for(auto u : v) sum+=cnt[a[i]^u];
  20. cnt[a[i]]++;
  21. }
  22.  
  23. void rem(int i){
  24. cnt[a[i]]--;
  25. for(auto u : v) sum-=cnt[a[i]^u];
  26. }
  27.  
  28. int main(){
  29. ios_base::sync_with_stdio(false); cin.tie(0);
  30. cin >> n >> q >> s;
  31. for(int i = 0; i < n; i++)
  32. a[i+1]=a[i]^(1<<(s[i]-'a'));
  33. v.pb(0);
  34. for(int i = 0; i < 26; i++) v.pb(1<<i);
  35. for(int i = 0; i < q; i++)
  36. cin >> l[i] >> r[i], l[i]--;
  37. vi ord(q,0); iota(all(ord),0);
  38. sort(all(ord),[&](int i, int j){
  39. if(l[i]/B!=l[j]/B) return l[i]<l[j];
  40. return (l[i]/B)%2?r[i]>r[j]:r[i]<r[j];
  41. });
  42. int L = 0, R = -1;
  43. for(auto i : ord){
  44. while(L>l[i]) add(--L);
  45. while(R<r[i]) add(++R);
  46. while(L<l[i]) rem(L++);
  47. while(R>r[i]) rem(R--);
  48. ans[i] = sum;
  49. }
  50. for(int i = 0; i < q; i++) cout << ans[i] << "\n";
  51. }
Success #stdin #stdout 0.01s 5284KB
stdin
10 2
lpdrbbrdpl
9 10
4 9
stdout
2
11