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
#include <stdio.h>
#include <stdlib.h>

#include "poszukiwania.h"
#include "message.h"

int main() {

        int *t;
        int sn, tp, i, j, r, e, p;

        sn = SignalLength();
        t = (int *)malloc(sn*sizeof(*t));

        t[0]=0; t[1]=0;
        for (tp=0, i=2; i<=sn; ++i) {
                while (tp>0 && SignalAt(tp+1)!=SignalAt(i)) tp=t[tp];
                if (SignalAt(tp+1)==SignalAt(i)) ++tp;
                t[i]=tp;
        }

        j=0;
        p = (SeqLength()-sn+2)/NumberOfNodes();
        if (p<97) p = 97;

        i=p * MyNodeId();
        if (i<1) i=1;
        e=(MyNodeId()+1)*p;
        if (e > SeqLength()-sn+2) e = SeqLength()-sn+2;
//      if (MyNodeId() == NumberOfNodes()-1) e = SeqLength()-sn+1;
        r = 0;
        while (i<=e) {
                j=t[j];
                while ( j<sn && SignalAt(j+1)==SeqAt(i+j)) j++;
                if (j==sn) r++;
                if (j>t[j]) i += j-t[j]; else ++i;
        }
        PutInt(0, r);
        Send(0);

        if (MyNodeId() == 0) {
                r = 0;
                for (i=0, j=0; i<NumberOfNodes(); ++i) {
                        Receive(i);
                        r += GetInt(i);
                }
                printf("%d\n", r);
        }
        return 0;
}