#include "palindromy.h" #include "message.h" #include <algorithm> #include <iostream> using namespace std; const int nax = 1e8 + 55; int p[nax]; char s[nax]; int main() { int nodes = NumberOfNodes(); assert(nodes >= 4); int my_id = MyNodeId(); int n = GetLength(); if(my_id >= 4) return 0; long long ans = 0; if(my_id == 0) { for(int i = 0; i < n; ++i) s[i] = GetLetter(i); int l = 0, r = 0; for(int i=0;i<n/2;i++) { if(i<r) p[i]=min(r-i+1,p[l+r-i+1]); int L=i-p[i], R=i+p[i]-1; while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[i]++,L--,R++; if(R>r) l=L,r=R; ans += p[i]; } } else if(my_id == 1) { for(int i = 0; i < n; ++i) s[i] = GetLetter(i); int l = 0, r = 0; for(int i=0;i<n/2;i++) { if(i<r) p[i]=min(r-i,p[l+r-i]); int L=i-p[i], R=i+p[i]; while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[i]++,L--,R++; if(R>r) l=L,r=R; ans += p[i] + 1; } } else if(my_id == 2) { for(int i = 0; i < n; ++i) s[n-1-i] = GetLetter(i); int l = 0, r = 0; for(int i=0;i<(n+1)/2;i++) { if(i<r) p[i]=min(r-i+1,p[l+r-i+1]); int L=i-p[i], R=i+p[i]-1; while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[i]++,L--,R++; if(R>r) l=L,r=R; ans += p[i]; } } else if(my_id == 3) { for(int i = 0; i < n; ++i) s[n-1-i] = GetLetter(i); int l = 0, r = 0; for(int i=0;i<(n+1)/2;i++) { if(i<r) p[i]=min(r-i,p[l+r-i]); int L=i-p[i], R=i+p[i]; while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[i]++,L--,R++; if(R>r) l=L,r=R; ans += p[i] + 1; } } if(my_id != 0) { PutLL(0, ans); Send(0); return 0; } for(int i = 1; i <= 3; ++i) { Receive(i); ans += GetLL(i); } printf("%lld\n", ans); }
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 86 87 88 | #include "palindromy.h" #include "message.h" #include <algorithm> #include <iostream> using namespace std; const int nax = 1e8 + 55; int p[nax]; char s[nax]; int main() { int nodes = NumberOfNodes(); assert(nodes >= 4); int my_id = MyNodeId(); int n = GetLength(); if(my_id >= 4) return 0; long long ans = 0; if(my_id == 0) { for(int i = 0; i < n; ++i) s[i] = GetLetter(i); int l = 0, r = 0; for(int i=0;i<n/2;i++) { if(i<r) p[i]=min(r-i+1,p[l+r-i+1]); int L=i-p[i], R=i+p[i]-1; while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[i]++,L--,R++; if(R>r) l=L,r=R; ans += p[i]; } } else if(my_id == 1) { for(int i = 0; i < n; ++i) s[i] = GetLetter(i); int l = 0, r = 0; for(int i=0;i<n/2;i++) { if(i<r) p[i]=min(r-i,p[l+r-i]); int L=i-p[i], R=i+p[i]; while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[i]++,L--,R++; if(R>r) l=L,r=R; ans += p[i] + 1; } } else if(my_id == 2) { for(int i = 0; i < n; ++i) s[n-1-i] = GetLetter(i); int l = 0, r = 0; for(int i=0;i<(n+1)/2;i++) { if(i<r) p[i]=min(r-i+1,p[l+r-i+1]); int L=i-p[i], R=i+p[i]-1; while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[i]++,L--,R++; if(R>r) l=L,r=R; ans += p[i]; } } else if(my_id == 3) { for(int i = 0; i < n; ++i) s[n-1-i] = GetLetter(i); int l = 0, r = 0; for(int i=0;i<(n+1)/2;i++) { if(i<r) p[i]=min(r-i,p[l+r-i]); int L=i-p[i], R=i+p[i]; while(L-1>=0 && R+1<n && s[L-1]==s[R+1]) p[i]++,L--,R++; if(R>r) l=L,r=R; ans += p[i] + 1; } } if(my_id != 0) { PutLL(0, ans); Send(0); return 0; } for(int i = 1; i <= 3; ++i) { Receive(i); ans += GetLL(i); } printf("%lld\n", ans); } |