#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include "message.h" using namespace std; int n, m; int tab[100005]; int tab2[100005]; char S1[100005]; char S2[100005]; int szerokosc[105]; int dlugosc[105]; int startSZ[105]; int startDL[105]; vector < pair <int, int> > v1, v2; pair <int, int> PP (pair <int, int> F, pair <int, int> S) { if (F < S) return F; return S; } bool rozproszony () { int moj_numer = MyNodeId(); int liczba_instancji = NumberOfNodes(); if (liczba_instancji > m) liczba_instancji = m; if (liczba_instancji > n) liczba_instancji = n; if (moj_numer >= liczba_instancji) return 0; for (int i = 0; i < liczba_instancji; ++i) szerokosc[i] = m / liczba_instancji; for (int i = 0; i < (m % liczba_instancji); ++i) szerokosc[i]++; for (int i = 0; i < liczba_instancji; ++i) dlugosc[i] = n / liczba_instancji; for (int i = 0; i < (n % liczba_instancji); ++i) dlugosc[i]++; startSZ[0] = 0; for (int i = 1; i <= liczba_instancji; ++i) startSZ[i] = startSZ[i - 1] + szerokosc[i - 1]; startDL[0] = 0; for (int i = 1; i <= liczba_instancji; ++i) startDL[i] = startDL[i - 1] + dlugosc[i - 1]; v1.clear(); for (int i = 0; i <= szerokosc[moj_numer]; ++i) v1.push_back(make_pair(startSZ[moj_numer] + i, 0)); for (int i = 0; i < liczba_instancji; ++i) { if (moj_numer == 0) { for (int j = 1; j <= dlugosc[i]; ++j) tab[j] = startDL[i] + j; for (int j = 1; j <= dlugosc[i]; ++j) tab2[j] = 0; } else { Receive(moj_numer - 1); for (int j = 1; j <= dlugosc[i]; ++j) { tab[j] = GetInt(moj_numer - 1); tab2[j] = GetInt(moj_numer - 1); } } for (int j = 1; j <= dlugosc[i]; ++j) { v2.clear(); v2.push_back(make_pair(tab[j], tab2[j])); for (int k = 1; k <= szerokosc[moj_numer]; ++k) { if (S1[startDL[i] + j] == S2[startSZ[moj_numer] + k]) { v2.push_back(PP(PP(v1[k - 1], make_pair(v1[k].first + 1, v1[k].second)), make_pair(v2[k - 1].first + 1, v2[k - 1].second))); } else if (S1[startDL[i] + j] > S2[startSZ[moj_numer] + k]) { v2.push_back(PP(PP(make_pair(v1[k - 1].first + 1, v1[k - 1].second), make_pair(v1[k].first + 1, v1[k].second)), make_pair(v2[k - 1].first + 1, v2[k - 1].second))); } else { v2.push_back(PP(PP(make_pair(v1[k - 1].first + 1, v1[k - 1].second + 1), make_pair(v1[k].first + 1, v1[k].second)), make_pair(v2[k - 1].first + 1, v2[k - 1].second))); } } v1.clear(); for (int k = 0; k <= szerokosc[moj_numer]; ++k) v1.push_back(v2[k]); if (moj_numer != liczba_instancji - 1) { PutInt(moj_numer + 1, v1[szerokosc[moj_numer]].first); PutInt(moj_numer + 1, v1[szerokosc[moj_numer]].second); } } if (moj_numer != liczba_instancji - 1) Send(moj_numer + 1); } if (moj_numer == liczba_instancji - 1) printf("%d %d\n", v1[szerokosc[moj_numer]].first, v1[szerokosc[moj_numer]].second); return 0; } int main () { scanf("%d%d",&n,&m); gets(S1); gets(S1 + 1); gets(S2 + 1); rozproszony(); 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 <cstdio> #include <algorithm> #include <vector> #include "message.h" using namespace std; int n, m; int tab[100005]; int tab2[100005]; char S1[100005]; char S2[100005]; int szerokosc[105]; int dlugosc[105]; int startSZ[105]; int startDL[105]; vector < pair <int, int> > v1, v2; pair <int, int> PP (pair <int, int> F, pair <int, int> S) { if (F < S) return F; return S; } bool rozproszony () { int moj_numer = MyNodeId(); int liczba_instancji = NumberOfNodes(); if (liczba_instancji > m) liczba_instancji = m; if (liczba_instancji > n) liczba_instancji = n; if (moj_numer >= liczba_instancji) return 0; for (int i = 0; i < liczba_instancji; ++i) szerokosc[i] = m / liczba_instancji; for (int i = 0; i < (m % liczba_instancji); ++i) szerokosc[i]++; for (int i = 0; i < liczba_instancji; ++i) dlugosc[i] = n / liczba_instancji; for (int i = 0; i < (n % liczba_instancji); ++i) dlugosc[i]++; startSZ[0] = 0; for (int i = 1; i <= liczba_instancji; ++i) startSZ[i] = startSZ[i - 1] + szerokosc[i - 1]; startDL[0] = 0; for (int i = 1; i <= liczba_instancji; ++i) startDL[i] = startDL[i - 1] + dlugosc[i - 1]; v1.clear(); for (int i = 0; i <= szerokosc[moj_numer]; ++i) v1.push_back(make_pair(startSZ[moj_numer] + i, 0)); for (int i = 0; i < liczba_instancji; ++i) { if (moj_numer == 0) { for (int j = 1; j <= dlugosc[i]; ++j) tab[j] = startDL[i] + j; for (int j = 1; j <= dlugosc[i]; ++j) tab2[j] = 0; } else { Receive(moj_numer - 1); for (int j = 1; j <= dlugosc[i]; ++j) { tab[j] = GetInt(moj_numer - 1); tab2[j] = GetInt(moj_numer - 1); } } for (int j = 1; j <= dlugosc[i]; ++j) { v2.clear(); v2.push_back(make_pair(tab[j], tab2[j])); for (int k = 1; k <= szerokosc[moj_numer]; ++k) { if (S1[startDL[i] + j] == S2[startSZ[moj_numer] + k]) { v2.push_back(PP(PP(v1[k - 1], make_pair(v1[k].first + 1, v1[k].second)), make_pair(v2[k - 1].first + 1, v2[k - 1].second))); } else if (S1[startDL[i] + j] > S2[startSZ[moj_numer] + k]) { v2.push_back(PP(PP(make_pair(v1[k - 1].first + 1, v1[k - 1].second), make_pair(v1[k].first + 1, v1[k].second)), make_pair(v2[k - 1].first + 1, v2[k - 1].second))); } else { v2.push_back(PP(PP(make_pair(v1[k - 1].first + 1, v1[k - 1].second + 1), make_pair(v1[k].first + 1, v1[k].second)), make_pair(v2[k - 1].first + 1, v2[k - 1].second))); } } v1.clear(); for (int k = 0; k <= szerokosc[moj_numer]; ++k) v1.push_back(v2[k]); if (moj_numer != liczba_instancji - 1) { PutInt(moj_numer + 1, v1[szerokosc[moj_numer]].first); PutInt(moj_numer + 1, v1[szerokosc[moj_numer]].second); } } if (moj_numer != liczba_instancji - 1) Send(moj_numer + 1); } if (moj_numer == liczba_instancji - 1) printf("%d %d\n", v1[szerokosc[moj_numer]].first, v1[szerokosc[moj_numer]].second); return 0; } int main () { scanf("%d%d",&n,&m); gets(S1); gets(S1 + 1); gets(S2 + 1); rozproszony(); return 0; } |