#include "poszukiwania.h"
#include "message.h"
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
long long n = SeqLength();
long long m = SignalLength();
vector<long long> wzor(m);
for(long long i=0; i<m; i++)
wzor[i] = SignalAt(i+1);
vector<long long> psuf(m+1);
long long p = psuf[0] = -1;
for(long long i=1; i<=m; i++){
while( p>-1 && wzor[p]!=wzor[i-1] ) p=psuf[p];
psuf[i]=++p;
}
if(n>400000){
long long pocz = ( MyNodeId() * (n-m) ) / NumberOfNodes();
long long kon = ( (MyNodeId()+1) * (n-m) ) / NumberOfNodes() + m;
long long wyn = p = 0;
for(long long i=pocz; i<kon; i++){
while( p>-1 && SeqAt(i+1)!=wzor[p] ) p=psuf[p];
if( ++p==m ){
wyn++;
p=psuf[p];
}
}
if(MyNodeId()>0){
PutLL(0, wyn);
Send(0);
} else {
for(long long i=1; i<NumberOfNodes(); i++){
long long inst=Receive(-1);
wyn+=GetLL(inst);
}
cout<<wyn;
}
} else if(MyNodeId()==0) {
long long wyn = p = 0;
for(long long i=0; i<n; i++){
while( p>-1 && SeqAt(i+1)!=wzor[p] ) p=psuf[p];
if( ++p==m ){
wyn++;
p=psuf[p];
}
}
cout<<wyn;
}
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 | #include "poszukiwania.h" #include "message.h" #include <algorithm> #include <iostream> #include <vector> using namespace std; int main() { long long n = SeqLength(); long long m = SignalLength(); vector<long long> wzor(m); for(long long i=0; i<m; i++) wzor[i] = SignalAt(i+1); vector<long long> psuf(m+1); long long p = psuf[0] = -1; for(long long i=1; i<=m; i++){ while( p>-1 && wzor[p]!=wzor[i-1] ) p=psuf[p]; psuf[i]=++p; } if(n>400000){ long long pocz = ( MyNodeId() * (n-m) ) / NumberOfNodes(); long long kon = ( (MyNodeId()+1) * (n-m) ) / NumberOfNodes() + m; long long wyn = p = 0; for(long long i=pocz; i<kon; i++){ while( p>-1 && SeqAt(i+1)!=wzor[p] ) p=psuf[p]; if( ++p==m ){ wyn++; p=psuf[p]; } } if(MyNodeId()>0){ PutLL(0, wyn); Send(0); } else { for(long long i=1; i<NumberOfNodes(); i++){ long long inst=Receive(-1); wyn+=GetLL(inst); } cout<<wyn; } } else if(MyNodeId()==0) { long long wyn = p = 0; for(long long i=0; i<n; i++){ while( p>-1 && SeqAt(i+1)!=wzor[p] ) p=psuf[p]; if( ++p==m ){ wyn++; p=psuf[p]; } } cout<<wyn; } return 0; } |
English