#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