#include <cstdio> #include <vector> #include "message.h" using namespace std; const int kMaxN = 100000; const int kMaxM = 100000; const int kInfinity = kMaxN + kMaxM; typedef vector<pair<int, int> > Vector; void Read(vector<char> *v) { for (int i = 0; i < v->size(); ++i) { (*v)[i] = ' '; while ((*v)[i] < 'a' || (*v)[i] > 'z') scanf("%c", &(*v)[i]); } } int main() { int n, m; scanf("%d%d", &n, &m); vector<char> src(n), dst(m); Read(&src); Read(&dst); const int node = MyNodeId(); const int nodes = NumberOfNodes(); const int left = (node * m) / nodes; const int right = ((node + 1) * m) / nodes; const int width = right - left + 1; Vector row_0, row_1; row_0.resize(width, make_pair(kInfinity, kInfinity)); row_1.resize(width, make_pair(kInfinity, kInfinity)); Vector *prev = &row_0; Vector *curr = &row_1; for (int i = 0; i < nodes; ++i) { const int top = (i * (n + 1)) / nodes; const int bottom = ((i + 1) * (n + 1)) / nodes; if (node > 0) Receive(node - 1); for (int j = top; j < bottom; ++j) { if (node == 0) { (*curr)[0] = make_pair(j, 0); } else { (*curr)[0].first = GetInt(node - 1); (*curr)[0].second = GetInt(node - 1); } for (int k = left; k < right; ++k) { pair<int, int> del = (*prev)[k + 1 - left]; ++del.first; pair<int, int> ins = (*curr)[k - left]; ++ins.first; pair<int, int> rep = (*prev)[k - left]; if (j > 0 && src[j - 1] != dst[k]) { ++rep.first; if (src[j - 1] < dst[k]) ++rep.second; } (*curr)[k + 1 - left] = min(min(del, ins), rep); } if (node < nodes - 1) { PutInt(node + 1, (*curr)[width - 1].first); PutInt(node + 1, (*curr)[width - 1].second); } swap(prev, curr); } if (node < nodes - 1) Send(node + 1); } if (node == nodes - 1) printf("%d %d\n", (*prev)[width - 1].first, (*prev)[width - 1].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 | #include <cstdio> #include <vector> #include "message.h" using namespace std; const int kMaxN = 100000; const int kMaxM = 100000; const int kInfinity = kMaxN + kMaxM; typedef vector<pair<int, int> > Vector; void Read(vector<char> *v) { for (int i = 0; i < v->size(); ++i) { (*v)[i] = ' '; while ((*v)[i] < 'a' || (*v)[i] > 'z') scanf("%c", &(*v)[i]); } } int main() { int n, m; scanf("%d%d", &n, &m); vector<char> src(n), dst(m); Read(&src); Read(&dst); const int node = MyNodeId(); const int nodes = NumberOfNodes(); const int left = (node * m) / nodes; const int right = ((node + 1) * m) / nodes; const int width = right - left + 1; Vector row_0, row_1; row_0.resize(width, make_pair(kInfinity, kInfinity)); row_1.resize(width, make_pair(kInfinity, kInfinity)); Vector *prev = &row_0; Vector *curr = &row_1; for (int i = 0; i < nodes; ++i) { const int top = (i * (n + 1)) / nodes; const int bottom = ((i + 1) * (n + 1)) / nodes; if (node > 0) Receive(node - 1); for (int j = top; j < bottom; ++j) { if (node == 0) { (*curr)[0] = make_pair(j, 0); } else { (*curr)[0].first = GetInt(node - 1); (*curr)[0].second = GetInt(node - 1); } for (int k = left; k < right; ++k) { pair<int, int> del = (*prev)[k + 1 - left]; ++del.first; pair<int, int> ins = (*curr)[k - left]; ++ins.first; pair<int, int> rep = (*prev)[k - left]; if (j > 0 && src[j - 1] != dst[k]) { ++rep.first; if (src[j - 1] < dst[k]) ++rep.second; } (*curr)[k + 1 - left] = min(min(del, ins), rep); } if (node < nodes - 1) { PutInt(node + 1, (*curr)[width - 1].first); PutInt(node + 1, (*curr)[width - 1].second); } swap(prev, curr); } if (node < nodes - 1) Send(node + 1); } if (node == nodes - 1) printf("%d %d\n", (*prev)[width - 1].first, (*prev)[width - 1].second); return 0; } |