Advertisement
Guest User

Untitled

a guest
Sep 25th, 2022
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = 1e6;
  5.  
  6. int n;
  7. char s[MAXN+1];
  8.  
  9. int prefix[26][MAXN+1];
  10.  
  11. vector<int> getCnt(int start, int end) {
  12. vector<int> ans(26, 0);
  13. for(int i=0; i<26; i++) {
  14. ans[i] = prefix[i][end] - prefix[i][start];
  15. }
  16. return ans;
  17. }
  18.  
  19. bool isValid(int a, int b, int c, int d) {
  20. vector<int> cntLeft = getCnt(a, b);
  21. vector<int> cntRight = getCnt(c, d);
  22. bool valid = true;
  23. int diffByOne = 0;
  24. for(int i=0; i<26; i++) {
  25. if(cntLeft[i] == cntRight[i]) {
  26. }
  27. else if(cntLeft[i] + 1 == cntRight[i]) {
  28. diffByOne++;
  29. }
  30. else {
  31. valid = false;
  32. }
  33. }
  34. if(valid and diffByOne == 1) {
  35. return true;
  36. }
  37. return false;
  38. }
  39.  
  40. int solve() {
  41. scanf("%s", s);
  42. n = strlen(s);
  43.  
  44. for(int i=0; i<26; i++) {
  45. for(int j=0; j<n; j++) {
  46. prefix[i][j+1] = prefix[i][j] + (s[j] == ('a' + i));
  47. }
  48. }
  49.  
  50. int q;
  51. scanf("%d", &q);
  52.  
  53. int ans = 0;
  54. while(q--) {
  55. int left, right;
  56. scanf("%d %d", &left, &right);
  57.  
  58. left--;
  59. int len = right - left;
  60. int mid = left + len / 2;
  61. if(len % 2 == 0) {
  62. continue;
  63. }
  64. if(len == 1) {
  65. ans++;
  66. continue;
  67. }
  68.  
  69. if(isValid(left, mid, mid, right)) {
  70. ans++;
  71. }
  72. else if(isValid(mid+1, right, left, mid+1)) {
  73. ans++;
  74. }
  75. }
  76. return ans;
  77. }
  78.  
  79. int main() {
  80. int t;
  81. scanf("%d", &t);
  82. for(int test=1; test<=t; test++) {
  83. printf("Case #%d: %d\n", test, solve());
  84. }
  85. }
  86.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement