1
0

CodeForces-17E.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6. int main() {
  7. ios::sync_with_stdio(false);
  8. cin.tie(nullptr);
  9. int n; string s; cin >> n >> s;
  10. vector<int> d1(n), d2(n);
  11. for (int i = 0, l = 0, r = -1; i < n; ++i) {
  12. int k = i > r ? 1 : min(d1[l + r - i], r - i + 1);
  13. while (i - k >= 0 && i + k < n && s[i - k] == s[i + k]) ++k;
  14. d1[i] = k;
  15. if (i + k - 1 > r) l = i - k + 1, r = i + k - 1;
  16. }
  17. for (int i = 0, l = 0, r = -1; i < n; ++i) {
  18. int k = i > r ? 0 : min(d2[l + r - i + 1], r - i + 1);
  19. while (i - k - 1 >= 0 && i + k < n && s[i - k - 1] == s[i + k]) ++k;
  20. d2[i] = k;
  21. if (i + k - 1 > r) l = i - k, r = i + k - 1;
  22. }
  23. vector<long long> start_diff(n + 1), end_diff(n + 1);
  24. auto add = [&](vector<long long> &diff, int l, int r) {
  25. if (l > r) return;
  26. ++diff[l]; --diff[r + 1];
  27. };
  28. long long palindromes = 0;
  29. for (int i = 0; i < n; ++i) {
  30. palindromes += d1[i] + d2[i];
  31. add(start_diff, i - d1[i] + 1, i);
  32. add(end_diff, i, i + d1[i] - 1);
  33. add(start_diff, i - d2[i], i - 1);
  34. add(end_diff, i, i + d2[i] - 1);
  35. }
  36. constexpr long long mod = 51123987;
  37. long long a = palindromes, b = palindromes - 1;
  38. if (a % 2 == 0) a /= 2; else b /= 2;
  39. long long all_pairs = (a % mod) * (b % mod) % mod;
  40. long long starts_here = 0, ends_here = 0, ended_before = 0, disjoint = 0;
  41. for (int i = 0; i < n; ++i) {
  42. starts_here += start_diff[i];
  43. ends_here += end_diff[i];
  44. disjoint = (disjoint + (starts_here % mod) * (ended_before % mod)) % mod;
  45. ended_before += ends_here;
  46. }
  47. cout << (all_pairs - disjoint + mod) % mod << '\n';
  48. }