#include"message.h" #include<cstdio> enum { MAX = 100010, MSG_SIZE = 105 }; char txt1[MAX], txt2[MAX]; int _tab[MAX], _tab2[MAX]; int *tab = _tab+1, *prev_tab = _tab2+1; int _disg[MAX], _disg2[MAX]; int *disg = _disg+1, *prev_disg = _disg2+1; int min(int a, int b) { return (a<b)?a:b; } int main() { int n, m; scanf("%d%d", &n, &m); scanf("%s",txt1); scanf("%s",txt2); int instance_id = MyNodeId(), instance_num = min(NumberOfNodes(),m); if(instance_id >= instance_num) return 0; int y_offset = instance_id*m/instance_num; int y_limit = (instance_id+1)*m/instance_num; int remaining = 0; int rdy = 0; for(int i = 0; i < m; i++) tab[i] = i+1; for(int i = 0; i < n; i++) { int *temp = tab; tab = prev_tab; prev_tab = temp; temp = disg; disg = prev_disg; prev_disg = temp; if(instance_id) { if(!remaining) { Receive(instance_id-1); remaining = MSG_SIZE; } tab[y_offset-1] = GetInt(instance_id-1); disg[y_offset-1] = GetInt(instance_id-1); remaining--; } else { tab[y_offset-1] = i+1; disg[y_offset-1] = 0; } for(int j = y_offset; j < y_limit; j++) { int cost = (txt1[i] == txt2[j])?0:1; int candidate = prev_tab[j]+1, disgust = prev_disg[j]; if(candidate > tab[j-1]+1 || (candidate == tab[j-1]+1 && disgust > disg[j-1])) {candidate = tab[j-1]+1; disgust = disg[j-1];} int last_c = prev_tab[j-1]+cost; int last_d = prev_disg[j-1]; if(txt1[i] < txt2[j]) last_d++; if(candidate > last_c || (candidate == last_c && disgust > last_d)) {candidate = last_c; disgust = last_d;} tab[j] = candidate; disg[j] = disgust; } if(instance_id+1 < instance_num) { PutInt(instance_id+1,tab[y_limit-1]); PutInt(instance_id+1,disg[y_limit-1]); rdy++; if(rdy >= MSG_SIZE) { Send(instance_id+1); rdy = 0; } } } if(rdy) Send(instance_id+1); if(y_limit == m) printf("%d %d\n", tab[m-1], disg[m-1]); 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 | #include"message.h" #include<cstdio> enum { MAX = 100010, MSG_SIZE = 105 }; char txt1[MAX], txt2[MAX]; int _tab[MAX], _tab2[MAX]; int *tab = _tab+1, *prev_tab = _tab2+1; int _disg[MAX], _disg2[MAX]; int *disg = _disg+1, *prev_disg = _disg2+1; int min(int a, int b) { return (a<b)?a:b; } int main() { int n, m; scanf("%d%d", &n, &m); scanf("%s",txt1); scanf("%s",txt2); int instance_id = MyNodeId(), instance_num = min(NumberOfNodes(),m); if(instance_id >= instance_num) return 0; int y_offset = instance_id*m/instance_num; int y_limit = (instance_id+1)*m/instance_num; int remaining = 0; int rdy = 0; for(int i = 0; i < m; i++) tab[i] = i+1; for(int i = 0; i < n; i++) { int *temp = tab; tab = prev_tab; prev_tab = temp; temp = disg; disg = prev_disg; prev_disg = temp; if(instance_id) { if(!remaining) { Receive(instance_id-1); remaining = MSG_SIZE; } tab[y_offset-1] = GetInt(instance_id-1); disg[y_offset-1] = GetInt(instance_id-1); remaining--; } else { tab[y_offset-1] = i+1; disg[y_offset-1] = 0; } for(int j = y_offset; j < y_limit; j++) { int cost = (txt1[i] == txt2[j])?0:1; int candidate = prev_tab[j]+1, disgust = prev_disg[j]; if(candidate > tab[j-1]+1 || (candidate == tab[j-1]+1 && disgust > disg[j-1])) {candidate = tab[j-1]+1; disgust = disg[j-1];} int last_c = prev_tab[j-1]+cost; int last_d = prev_disg[j-1]; if(txt1[i] < txt2[j]) last_d++; if(candidate > last_c || (candidate == last_c && disgust > last_d)) {candidate = last_c; disgust = last_d;} tab[j] = candidate; disg[j] = disgust; } if(instance_id+1 < instance_num) { PutInt(instance_id+1,tab[y_limit-1]); PutInt(instance_id+1,disg[y_limit-1]); rdy++; if(rdy >= MSG_SIZE) { Send(instance_id+1); rdy = 0; } } } if(rdy) Send(instance_id+1); if(y_limit == m) printf("%d %d\n", tab[m-1], disg[m-1]); return 0; } |