#include <cstdio>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include "message.h"
using namespace std;
void recPut(int target, int x) {
PutInt(target, x);
}
template<class T, class U>
void recPut(int target, const pair<T, U>& x) {
recPut(target, x.first);
recPut(target, x.second);
}
template<class T>
void recPut(int target, const vector<T>& V) {
PutInt(target, V.size());
for (auto& x:V) recPut(target, x);
}
void recGet(int target, int& x) {
x=GetInt(target);
}
template<class T, class U>
void recGet(int target, pair<T, U>& x) {
recGet(target, x.first);
recGet(target, x.second);
}
template<class T>
void recGet(int target, vector<T>& V) {
V.resize(GetInt(target));
for (auto& x:V) recGet(target, x);
}
int main() {
int nodeCnt=NumberOfNodes();
int nodeId=MyNodeId();
int N, M;
bool r=false;
scanf("%d%d", &N, &M);
if (N>M) {
r=true;
swap(N, M);
}
char A[110000];
char B[110000];
pair <int, int> R[110000];
if (!r) scanf("%s%s", A, B);
else scanf("%s%s", B, A);
int xStep=max(10, (N+nodeCnt-1)/nodeCnt);
int yStep=max(10, M/800);
int X=(N+xStep-1)/xStep;
int Y=(M+yStep-1)/yStep;
if (nodeId>=X) return 0;
for (int i=0; i<=xStep; i++)
R[i]=make_pair(i+nodeId*xStep,0);
char *T=A+nodeId*xStep;
pair<int, int> res;
if (nodeId==X-1 && N%xStep!=0) xStep=N%xStep; // <- !!!
for (int y=0, s=0; y<M; y++, s=(s+1)%yStep) {
if (nodeId==0) res=make_pair(y+1,0);
else {
if (!s) Receive(nodeId-1);
recGet(nodeId-1, res);
}
for (int x=0; x<xStep; x++) {
pair<int, int> newRes=(R[x]);
if (T[x]!=B[y]) {
newRes.first++;
if ((!r) && T[x]<B[y]) newRes.second++;
if ((r) && T[x]>B[y]) newRes.second++;
}
newRes=min(newRes, make_pair(res.first+1, res.second));
newRes=min(newRes, make_pair(R[x+1].first+1, R[x+1].second));
R[x]=res;
res=newRes;
}
R[xStep]=res;
if (nodeId<X-1) {
recPut(nodeId+1, res);
if (s==yStep-1 || y==M-1) Send(nodeId+1);
}
}
if (nodeId==X-1) {
// printf("Node: %d %d %d\n", nodeId, xStep, yStep);
printf("%d %d\n", res.first, res.second);
}
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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include <cstdio> #include <cstdlib> #include <vector> #include <set> #include <map> #include <algorithm> #include "message.h" using namespace std; void recPut(int target, int x) { PutInt(target, x); } template<class T, class U> void recPut(int target, const pair<T, U>& x) { recPut(target, x.first); recPut(target, x.second); } template<class T> void recPut(int target, const vector<T>& V) { PutInt(target, V.size()); for (auto& x:V) recPut(target, x); } void recGet(int target, int& x) { x=GetInt(target); } template<class T, class U> void recGet(int target, pair<T, U>& x) { recGet(target, x.first); recGet(target, x.second); } template<class T> void recGet(int target, vector<T>& V) { V.resize(GetInt(target)); for (auto& x:V) recGet(target, x); } int main() { int nodeCnt=NumberOfNodes(); int nodeId=MyNodeId(); int N, M; bool r=false; scanf("%d%d", &N, &M); if (N>M) { r=true; swap(N, M); } char A[110000]; char B[110000]; pair <int, int> R[110000]; if (!r) scanf("%s%s", A, B); else scanf("%s%s", B, A); int xStep=max(10, (N+nodeCnt-1)/nodeCnt); int yStep=max(10, M/800); int X=(N+xStep-1)/xStep; int Y=(M+yStep-1)/yStep; if (nodeId>=X) return 0; for (int i=0; i<=xStep; i++) R[i]=make_pair(i+nodeId*xStep,0); char *T=A+nodeId*xStep; pair<int, int> res; if (nodeId==X-1 && N%xStep!=0) xStep=N%xStep; // <- !!! for (int y=0, s=0; y<M; y++, s=(s+1)%yStep) { if (nodeId==0) res=make_pair(y+1,0); else { if (!s) Receive(nodeId-1); recGet(nodeId-1, res); } for (int x=0; x<xStep; x++) { pair<int, int> newRes=(R[x]); if (T[x]!=B[y]) { newRes.first++; if ((!r) && T[x]<B[y]) newRes.second++; if ((r) && T[x]>B[y]) newRes.second++; } newRes=min(newRes, make_pair(res.first+1, res.second)); newRes=min(newRes, make_pair(R[x+1].first+1, R[x+1].second)); R[x]=res; res=newRes; } R[xStep]=res; if (nodeId<X-1) { recPut(nodeId+1, res); if (s==yStep-1 || y==M-1) Send(nodeId+1); } } if (nodeId==X-1) { // printf("Node: %d %d %d\n", nodeId, xStep, yStep); printf("%d %d\n", res.first, res.second); } return 0; } |
English