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
103
#include<cstdio>
#include<vector>
#include<algorithm>
#include<set>
#include<iostream>

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

using namespace std;

#define rep(i,n) for(int i=0; i<(int)n; i++)
#define st first
#define nd second
#define mp make_pair
#define pb push_back

typedef vector<int> vi;
typedef pair<int, int> pi;
typedef vector<pi> vpii;
typedef set<int> SI;

#ifdef DEBUG
const bool debug = true;
#else
const bool debug = false;
#endif
long long SIGL, M, k, l, d, a, b;
int inst_cnt, my_nr;


const int inf = 1000 * 1000 * 1000 ;
const int MAKSN = inf + 13; // UZUPElnic

long long mini = inf;
long long sum = 0;

long long mojPoczatek = 1LL, mojKoniec = 1LL;

void readIn()
{
  M = SeqLength();
  SIGL = SignalLength();
  inst_cnt = NumberOfNodes();
  my_nr = MyNodeId();

  long long segmentL = max(M / inst_cnt, 1LL);
//   printf("%lld\n",segmentL);
  mojPoczatek = 1LL + my_nr * segmentL;
  mojKoniec = mojPoczatek + segmentL;
}


bool check (long long pos)
{
  for (long long i = 1; i <= SIGL; i++)
  {
    if (i + pos > M)
      return false;

    if (SignalAt (i) != SeqAt (pos + i))
      return false;
  }

  return true;
}


void solve()
{
  int ans = 0;

  for (long long i = mojPoczatek; i < mojKoniec; i++)
  {
    if (check (i))
      ans++;
  }


  if (MyNodeId() > 0)
  {
    PutInt (0, ans);
    Send (0);
  }
  else  // MyNodeId == 0
  {

    for (int i = 1; i < inst_cnt; ++i)
    {
      int instancja = Receive (-1);
      ans += GetInt (instancja);
    }

    printf ("%d\n", ans);
  }
}

int main()
{
  readIn();
  solve();
  return 0;
}