#include <iostream> #include <utility> #include <cmath> #include "poszukiwania.h" #include "message.h" using namespace std; /* * MESSAGE.H: * int NumberOfNodes(); * int myNodeId(); * * * [T] = Char | Int | LL * * Put[T](int target, [T] value) * send(int target) * * int receive(int target) * [T] Get[T](int source) * */ pair<int, int> getStartEnd(int n, int m, int nodeID, int totalNodes){ int startPoints = n - m + 1; int SPPerInstance = ceil((double)startPoints / (double)totalNodes); int start = SPPerInstance * nodeID; int end = start + SPPerInstance - 1; if(end >= startPoints){ end = startPoints - 1; } return pair<int, int>(start, end); } using namespace std; int main(){ int NodesN = NumberOfNodes(); int myNode = MyNodeId(); long long tLen = SeqLength(); long long pLen = SignalLength(); pair<int, int> SE = getStartEnd(tLen, pLen, myNode, NodesN); int start = SE.first + 1; int end = SE.second + 1; int result = 0; if(start <= end){ int *pref = new int[pLen + 1]; int *wzor = new int[pLen + 1]; pref[1] = 0; int k = 0; // SZUKAMY WYSTĄPIEŃ WZORCA W TEKŚCIE wzor[1] = SignalAt(1); for(int i = 2; i <= pLen; ++i){ wzor[i] = SignalAt(i); while(k > 0 && wzor[k + 1] != wzor[i]){ k = pref[k]; } if(wzor[k + 1] == wzor[i]){ k = k + 1; } pref[i] = k; } // tablica pref[q] ma wszystko, co potrzeba int textend = end + pLen - 1; int q = 0; for(int i = start; i <= textend; ++i){ int txti = SeqAt(i); while(q > 0 && wzor[q + 1] != txti){ q = pref[q]; } if(wzor[q + 1] == txti){ q = q + 1; } if(q == pLen){ result = result + 1; q = pref[q]; } } } if(myNode == 0){ // odbieramy i wypisujemy sumę for(int i = 1; i < NodesN; ++i){ int src = Receive(-1); result += GetInt(src); } cout << result << endl; }else{ // wysyłamy sumę punktów spełniających wymagania PutInt(0, result); Send(0); } 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 | #include <iostream> #include <utility> #include <cmath> #include "poszukiwania.h" #include "message.h" using namespace std; /* * MESSAGE.H: * int NumberOfNodes(); * int myNodeId(); * * * [T] = Char | Int | LL * * Put[T](int target, [T] value) * send(int target) * * int receive(int target) * [T] Get[T](int source) * */ pair<int, int> getStartEnd(int n, int m, int nodeID, int totalNodes){ int startPoints = n - m + 1; int SPPerInstance = ceil((double)startPoints / (double)totalNodes); int start = SPPerInstance * nodeID; int end = start + SPPerInstance - 1; if(end >= startPoints){ end = startPoints - 1; } return pair<int, int>(start, end); } using namespace std; int main(){ int NodesN = NumberOfNodes(); int myNode = MyNodeId(); long long tLen = SeqLength(); long long pLen = SignalLength(); pair<int, int> SE = getStartEnd(tLen, pLen, myNode, NodesN); int start = SE.first + 1; int end = SE.second + 1; int result = 0; if(start <= end){ int *pref = new int[pLen + 1]; int *wzor = new int[pLen + 1]; pref[1] = 0; int k = 0; // SZUKAMY WYSTĄPIEŃ WZORCA W TEKŚCIE wzor[1] = SignalAt(1); for(int i = 2; i <= pLen; ++i){ wzor[i] = SignalAt(i); while(k > 0 && wzor[k + 1] != wzor[i]){ k = pref[k]; } if(wzor[k + 1] == wzor[i]){ k = k + 1; } pref[i] = k; } // tablica pref[q] ma wszystko, co potrzeba int textend = end + pLen - 1; int q = 0; for(int i = start; i <= textend; ++i){ int txti = SeqAt(i); while(q > 0 && wzor[q + 1] != txti){ q = pref[q]; } if(wzor[q + 1] == txti){ q = q + 1; } if(q == pLen){ result = result + 1; q = pref[q]; } } } if(myNode == 0){ // odbieramy i wypisujemy sumę for(int i = 1; i < NodesN; ++i){ int src = Receive(-1); result += GetInt(src); } cout << result << endl; }else{ // wysyłamy sumę punktów spełniających wymagania PutInt(0, result); Send(0); } return 0; } |