#include "poszukiwania.h"
#include "message.h"
#include <cstdio>
typedef long long ll;
const ll E=5463458053,F=3367900313;
ll mlen(){return SeqLength();}
ll mat(ll i){return SeqAt(i+1);}
ll slen(){return SignalLength();}
ll sat(ll i){return SignalAt(i+1);}
ll shash(ll s){ll i,h=0;for(i=0;i<s;++i)h+=sat(i);return h+E*sat(0)+F*sat(s-1);}
ll mhash(ll k,ll s){ll i,h=0;for(i=0;i<s;++i)h+=mat(k+i);return h+E*mat(k)+F*mat(k+s-1);}
ll chk(ll k,ll s){ll i;for(i=0;i<s;++i)if(sat(i)!=mat(k+i))return 0;return 1;}
ll sol(){
ll n=NumberOfNodes(),k=MyNodeId(),m=SeqLength(),s=SignalLength(),hs=shash(s),hm,r=0,i;
if(k+s>=m)return 0;
hm=mhash(k,s);
while(k+s<m){
if(hs==hm)r+=1;//chk(k,s);
if(k+s+n>=m)break;
hm-=E*mat(k)+F*mat(k+s-1);
for(i=0;i<n;++i)hm+=mat(k+s+i)-mat(k+i);
k+=n;
hm+=E*mat(k)+F*mat(k+s-1);
}
return r;
}
int main(){
ll i,r=sol();
if(!MyNodeId()){for(i=1;i<NumberOfNodes();++i)r+=GetInt(Receive(-1));printf("%lld\n",r);}else{PutInt(0,r);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 | #include "poszukiwania.h" #include "message.h" #include <cstdio> typedef long long ll; const ll E=5463458053,F=3367900313; ll mlen(){return SeqLength();} ll mat(ll i){return SeqAt(i+1);} ll slen(){return SignalLength();} ll sat(ll i){return SignalAt(i+1);} ll shash(ll s){ll i,h=0;for(i=0;i<s;++i)h+=sat(i);return h+E*sat(0)+F*sat(s-1);} ll mhash(ll k,ll s){ll i,h=0;for(i=0;i<s;++i)h+=mat(k+i);return h+E*mat(k)+F*mat(k+s-1);} ll chk(ll k,ll s){ll i;for(i=0;i<s;++i)if(sat(i)!=mat(k+i))return 0;return 1;} ll sol(){ ll n=NumberOfNodes(),k=MyNodeId(),m=SeqLength(),s=SignalLength(),hs=shash(s),hm,r=0,i; if(k+s>=m)return 0; hm=mhash(k,s); while(k+s<m){ if(hs==hm)r+=1;//chk(k,s); if(k+s+n>=m)break; hm-=E*mat(k)+F*mat(k+s-1); for(i=0;i<n;++i)hm+=mat(k+s+i)-mat(k+i); k+=n; hm+=E*mat(k)+F*mat(k+s-1); } return r; } int main(){ ll i,r=sol(); if(!MyNodeId()){for(i=1;i<NumberOfNodes();++i)r+=GetInt(Receive(-1));printf("%lld\n",r);}else{PutInt(0,r);Send(0);} return 0; } |
English