#include<iostream> #include<algorithm> #include<vector> #include<set> #include "message.h" using namespace std; #define ll long long #define ld long double #define vi vector<int> #define vii vector<pair<int, int> > #define pb push_back #define pii pair<int,int> #define mp make_pair #define st first #define nd second #define mini(a,b) a=min(a,(b)) #define maxi(a,b) a=max(a,(b)) #define RE(i,n) for(int i=0,_n=(n);i<_n;++i) #define RI(i,n) for(int i=1,_n=(n);i<=_n;++i) #define h first #define id second const int inf=1e9+5, nax = 1e5 + 5; int n, m; char s1[nax], s2[nax]; pii t[nax]; int main() { ios_base::sync_with_stdio(0); // eighfivwrlsfdljqhwfkj zabierz to klsfjgbwilrjgfdsojn cin >> n >> m; cin >> s1 >> s2; int ja = MyNodeId(); int ile = NumberOfNodes(); RE(i, nax) t[i] = mp(inf, inf); if(ja) { RE(i, n) { if(i % 200 == 0) Receive(ja - 1); pii x, y; x.first = GetInt(ja - 1); x.second = GetInt(ja - 1); int dol = ja * m / ile, gora = (ja + 1) * m / ile; for(int poz = dol + 1; poz <= min(gora, m - 1); ++poz) { y = min(t[poz], x); y.first += 1; int roz = ((int) s2[poz]) - ((int) s1[i]); if(roz > 0) t[poz - 1].second += 1; else if(roz != 0) t[poz - 1].first += 1; mini(y, t[poz - 1]); t[poz - 1] = x; x = y; } if(ja == ile - 1) t[m - 1] = x; else { PutInt(ja + 1, x.first); PutInt(ja + 1, x.second); if((i+1)%200 == 0 || i == n - 1) Send(ja + 1); } } if(ja == ile - 1) cout << t[m - 1].first << " " << t[m - 1].second; } else { RE(i, n) { pii x, y; x = mp(i + 1, 0); int dol = ja * m / ile, gora = (ja + 1) * m / ile; for(int poz = dol + 1; poz <= min(gora, m - 1); ++poz) { y = min(t[poz], x); y.first += 1; int roz = ((int) s2[poz]) - ((int) s1[i]); if(roz > 0) t[poz - 1].second += 1; else if(roz != 0) t[poz - 1].first += 1; mini(y, t[poz - 1]); t[poz - 1] = x; x = y; } if(ja == ile - 1) t[m - 1] = x; else { PutInt(ja + 1, x.first); PutInt(ja + 1, x.second); if((i+1)%200 == 0 || i == n - 1) Send(ja + 1); } } if(ja == ile - 1) cout << t[m - 1].first << " " << t[m - 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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include<iostream> #include<algorithm> #include<vector> #include<set> #include "message.h" using namespace std; #define ll long long #define ld long double #define vi vector<int> #define vii vector<pair<int, int> > #define pb push_back #define pii pair<int,int> #define mp make_pair #define st first #define nd second #define mini(a,b) a=min(a,(b)) #define maxi(a,b) a=max(a,(b)) #define RE(i,n) for(int i=0,_n=(n);i<_n;++i) #define RI(i,n) for(int i=1,_n=(n);i<=_n;++i) #define h first #define id second const int inf=1e9+5, nax = 1e5 + 5; int n, m; char s1[nax], s2[nax]; pii t[nax]; int main() { ios_base::sync_with_stdio(0); // eighfivwrlsfdljqhwfkj zabierz to klsfjgbwilrjgfdsojn cin >> n >> m; cin >> s1 >> s2; int ja = MyNodeId(); int ile = NumberOfNodes(); RE(i, nax) t[i] = mp(inf, inf); if(ja) { RE(i, n) { if(i % 200 == 0) Receive(ja - 1); pii x, y; x.first = GetInt(ja - 1); x.second = GetInt(ja - 1); int dol = ja * m / ile, gora = (ja + 1) * m / ile; for(int poz = dol + 1; poz <= min(gora, m - 1); ++poz) { y = min(t[poz], x); y.first += 1; int roz = ((int) s2[poz]) - ((int) s1[i]); if(roz > 0) t[poz - 1].second += 1; else if(roz != 0) t[poz - 1].first += 1; mini(y, t[poz - 1]); t[poz - 1] = x; x = y; } if(ja == ile - 1) t[m - 1] = x; else { PutInt(ja + 1, x.first); PutInt(ja + 1, x.second); if((i+1)%200 == 0 || i == n - 1) Send(ja + 1); } } if(ja == ile - 1) cout << t[m - 1].first << " " << t[m - 1].second; } else { RE(i, n) { pii x, y; x = mp(i + 1, 0); int dol = ja * m / ile, gora = (ja + 1) * m / ile; for(int poz = dol + 1; poz <= min(gora, m - 1); ++poz) { y = min(t[poz], x); y.first += 1; int roz = ((int) s2[poz]) - ((int) s1[i]); if(roz > 0) t[poz - 1].second += 1; else if(roz != 0) t[poz - 1].first += 1; mini(y, t[poz - 1]); t[poz - 1] = x; x = y; } if(ja == ile - 1) t[m - 1] = x; else { PutInt(ja + 1, x.first); PutInt(ja + 1, x.second); if((i+1)%200 == 0 || i == n - 1) Send(ja + 1); } } if(ja == ile - 1) cout << t[m - 1].first << " " << t[m - 1].second; } return 0; } |