fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = 100005;
  5. int ps[MAXN][26];
  6.  
  7. int main() {
  8. ios_base::sync_with_stdio(false);
  9. cin.tie(NULL);
  10.  
  11. string s;
  12. if (!(cin >> s)) return 0;
  13. int n = s.length();
  14.  
  15. // Xây dựng mảng prefix sum ps[i][c]
  16. // ps[i][c] lưu số lượng ký tự c từ đầu xâu đến vị trí i - 1
  17. for (int i = 0; i < n; ++i) {
  18. for (int c = 0; c < 26; ++c) {
  19. ps[i + 1][c] = ps[i][c];
  20. }
  21. ps[i + 1][s[i] - 'a']++;
  22. }
  23.  
  24. long long ans = 0;
  25.  
  26. // Duyệt qua từng điểm bắt đầu l
  27. for (int l = 0; l < n; ++l) {
  28. // r chạy sao cho độ dài (r - l + 1) luôn chẵn (r - l lẻ, tức là r bắt đầu từ l + 1 và nhảy 2 bước)
  29. for (int r = l + 1; r < n; r += 2) {
  30. int mid = l + (r - l) / 2;
  31. bool ok = true;
  32.  
  33. // Kiểm tra các ký tự từ 'a' đến 'z'
  34. for (int c = 0; c < 26; ++c) {
  35. int count_left = ps[mid + 1][c] - ps[l][c]; // Số lượng c ở nửa trái [l, mid]
  36. int count_right = ps[r + 1][c] - ps[mid + 1][c]; // Số lượng c ở nửa phải [mid + 1, r]
  37.  
  38. // Điều kiện: Ký tự xuất hiện ở nửa trái phải tương đương với nửa phải
  39. if ((count_left > 0) != (count_right > 0)) {
  40. ok = false;
  41. break;
  42. }
  43. }
  44.  
  45. if (ok) {
  46. ans++;
  47. }
  48. }
  49. }
  50.  
  51. cout << ans << "\n";
  52. return 0;
  53. }
Success #stdin #stdout 0.01s 5308KB
stdin
ababbcd
stdout
2