#include "poszukiwania.h"
#include "message.h"
#include <iostream>
using namespace std;
#define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b))
long long n,m;
int counter;
bool compare (long long start)
{
for(long long i=1;i<=m;i++)
if (SignalAt(i) != SeqAt(i+start-1))
return false;
return true;
}
void KR(long long starting, long long ending) {
long long d, hx =0, hy =0;
long long i, j;
for (d = i = 1; i < m; ++i)
d = (d<<1);
for (i = 1; i <= m; ++i) {
hx = ((hx<<1) + SignalAt(i));
hy = ((hy<<1) + SeqAt(i+starting-1));
}
j = 1;
while (j <= ending-starting) {
if (hx == hy && compare(j+starting-1))
counter++;
if (j != ending-starting) hy = REHASH(SeqAt(j+starting-1), SeqAt(j + starting + m- 1), hy);
++j;
}
}
int main()
{
n = SeqLength();
m = SignalLength();
int nodes = NumberOfNodes();
int instance = MyNodeId();
long long attempts = n - m + 1;
long long amount = attempts/nodes;
long long starting = amount*instance +1;
if (instance<attempts%nodes)
{
starting+= instance;
}
else
{
starting += attempts%nodes;
}
long long ending = starting + amount;
if (instance<attempts%nodes)
{
ending++;
}
counter = 0;
if ( starting != ending) KR(starting, ending);
//cout<<counter<<endl;
if(instance != 0)
{
PutInt(0, counter);
Send(0);
}
else
{
long long counted = counter;
for(int k = 1; k<nodes; k++)
{
Receive(k);
int received;
received = GetInt(k);
//cout<<received<<endl;
counted += received;
}
cout<<counted<<endl;
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 102 | #include "poszukiwania.h" #include "message.h" #include <iostream> using namespace std; #define REHASH(a, b, h) ((((h) - (a)*d) << 1) + (b)) long long n,m; int counter; bool compare (long long start) { for(long long i=1;i<=m;i++) if (SignalAt(i) != SeqAt(i+start-1)) return false; return true; } void KR(long long starting, long long ending) { long long d, hx =0, hy =0; long long i, j; for (d = i = 1; i < m; ++i) d = (d<<1); for (i = 1; i <= m; ++i) { hx = ((hx<<1) + SignalAt(i)); hy = ((hy<<1) + SeqAt(i+starting-1)); } j = 1; while (j <= ending-starting) { if (hx == hy && compare(j+starting-1)) counter++; if (j != ending-starting) hy = REHASH(SeqAt(j+starting-1), SeqAt(j + starting + m- 1), hy); ++j; } } int main() { n = SeqLength(); m = SignalLength(); int nodes = NumberOfNodes(); int instance = MyNodeId(); long long attempts = n - m + 1; long long amount = attempts/nodes; long long starting = amount*instance +1; if (instance<attempts%nodes) { starting+= instance; } else { starting += attempts%nodes; } long long ending = starting + amount; if (instance<attempts%nodes) { ending++; } counter = 0; if ( starting != ending) KR(starting, ending); //cout<<counter<<endl; if(instance != 0) { PutInt(0, counter); Send(0); } else { long long counted = counter; for(int k = 1; k<nodes; k++) { Receive(k); int received; received = GetInt(k); //cout<<received<<endl; counted += received; } cout<<counted<<endl; return 0; } } |
English