#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
#include "message.h"
#include "palindromy.h"
namespace {
struct String {
  int n;
  String():
    n(2 * GetLength() + 1)
  {
  }
  int size() const
  {
    return n;
  }
  char operator[](int i) const
  {
    if ((i & 1) == 0) return '.';
    return GetLetter(i >> 1);
  }
};
}
int main()
{
  int k = NumberOfNodes();
  int id = MyNodeId();
  if (id >= k) return 0;
  String s;
  int n = s.size();
  int left = (id + 0LL) * n / k;
  int right = (id + 1LL) * n / k;
  vector<int> p(right - left);
  int best_c = 0, best_r = 0;
  for (int i = left; i < right; i++) {
    int cur;
    if (i > best_r || best_c - (i - best_c) < left) {
      cur = 0;
    } else {
      cur = min(p[best_c - (i - best_c) - left], best_r - i);
    }
    auto l = i - cur - 1;
    auto r = i + cur + 1;
    while (l >= 0 && r < n && s[l] == s[r]) {
      --l;
      ++r;
    }
    cur = i - l - 1;
    if (i + cur >= best_r) {
      best_c = i;
      best_r = i + cur;
    }
    p[i - left] = cur;
  }
  long long res = 0;
  for (int w: p) res += (w + 1) / 2;
  if (id > 0) {
    Receive(id - 1);
    res += GetLL(id - 1);
  }
  if (id < k - 1) {
    PutLL(id + 1, res);
    Send(id + 1);
  } else {
    cout << res << endl;
  }
  return 0;
}
        | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <algorithm> #include <iostream> #include <vector> using namespace std; #include "message.h" #include "palindromy.h" namespace { struct String { int n; String(): n(2 * GetLength() + 1) { } int size() const { return n; } char operator[](int i) const { if ((i & 1) == 0) return '.'; return GetLetter(i >> 1); } }; } int main() { int k = NumberOfNodes(); int id = MyNodeId(); if (id >= k) return 0; String s; int n = s.size(); int left = (id + 0LL) * n / k; int right = (id + 1LL) * n / k; vector<int> p(right - left); int best_c = 0, best_r = 0; for (int i = left; i < right; i++) { int cur; if (i > best_r || best_c - (i - best_c) < left) { cur = 0; } else { cur = min(p[best_c - (i - best_c) - left], best_r - i); } auto l = i - cur - 1; auto r = i + cur + 1; while (l >= 0 && r < n && s[l] == s[r]) { --l; ++r; } cur = i - l - 1; if (i + cur >= best_r) { best_c = i; best_r = i + cur; } p[i - left] = cur; } long long res = 0; for (int w: p) res += (w + 1) / 2; if (id > 0) { Receive(id - 1); res += GetLL(id - 1); } if (id < k - 1) { PutLL(id + 1, res); Send(id + 1); } else { cout << res << endl; } return 0; } | 
 
            
         English
                    English