#include <bits/stdc++.h>
using namespace std;
struct EDGE {
  int to, next, len;
} e[2000010], ee[2000010];
int head[1000001], ehead[1000001], top, etop, n, in[1000001], cnt, vis[1000001],
    cntt[1000001];
queue<int> q;
void eadd(int u, int v) {
  ee[etop].to = v;
  ee[etop].next = ehead[u];
  ehead[u] = etop++;
}
void add(int u, int v) {
  in[v]++;
  e[top].to = v;
  e[top].next = head[u];
  head[u] = top++;
  eadd(v, u);
}
void dfs(int eid) {
  int i, s = e[eid].to;
  bool flag = 0;
  for (i = head[s]; ~i; i = e[i].next) {
    flag = 1;
    dfs(i);
  }
  if (flag)
    e[eid].len = e[head[s]].len + 1;
  else
    e[eid].len = 1;
}
void dfs1(int eid) {
  int i, s = e[eid].to;
  vis[s] = 1;
  for (i = head[s]; ~i; i = e[i].next) {
    dfs1(e[i].to);
  }
}
void print() {
  int i;
  for (i = 0; i < n; i++) {
    if (in[i]) continue;
    printf("i=%d,vis[i]=%d,cntt[i]=%d\n\n", i, vis[i], cntt[i]);
  }
}
void topo() {
  int i, j;
  for (i = 0; i < n; i++) {
    if (in[i] == 0) {
      for (j = head[i]; ~j; j = e[j].next) {
        dfs(j);
        if (e[j].len > 1) {
          cnt++;
          vis[i] = 1;
          dfs1(j);
        }
      }
    }
  }
  for (i = 0; i < n; i++) {
    if (in[i] == 0) {
      for (j = head[i]; ~j; j = e[j].next) {
        cntt[i] += !vis[e[j].to];
      }
      if (cntt[i] == 1 && !vis[i]) {
        q.push(i);
      }
    }
  }
  int s, t;
  while (!q.empty()) {
    s = q.front();
    q.pop();
    if (cntt[s] == 0) {
      vis[s] = 1;
      cnt++;
      continue;
    }
    for (i = head[s]; ~i; i = e[i].next) {
      t = e[i].to;
      if (vis[t]) continue;
      vis[s] = 1;
      vis[t] = 1;
      cntt[s] = 0;
      cnt++;
      for (j = ehead[t]; ~j; j = ee[j].next) {
        if (ee[j].to == s) continue;
        cntt[ee[j].to]--;
        if (cntt[ee[j].to] == 1 && !vis[ee[j].to]) q.push(ee[j].to);
      }
    }
  }
  for (i = 0; i < n; i++) {
    if (in[i] == 0) {
      if (!vis[i]) {
        if (!cntt[i]) {
          vis[i] = 1;
          cnt++;
        }
      }
    }
  }
  q = queue<int>();
  for (i = 0; i < n; i++) {
    if (in[i] == 0) {
      if (vis[i]) {
        if (cntt[i] == 1) {
          q.push(i);
        }
      }
    }
  }
  while (!q.empty()) {
    i = q.front();
    q.pop();
    if (cntt[i] == 0) continue;
    for (j = head[i]; ~j; j = e[j].next) {
      if (vis[e[j].to]) continue;
      t = e[j].to;
    }
    for (j = ehead[t]; ~j; j = ee[j].next) {
      if (ee[j].to == i) continue;
      s = ee[j].to;
    }
    if (vis[s]) {
      vis[t] = 1;
      cntt[s]--;
      cntt[i]--;
      cnt++;
    } else {
      if (cntt[s] != 2) {
        printf("Dblark AK IOI\n");
        return;
      }
      vis[s] = 1;
      vis[t] = 1;
      cnt++;
      cntt[s]--;
      cntt[i]--;
      q.push(s);
    }
  }
  for (i = 0; i < n; i++) {
    if (!in[i]) {
      if (!vis[i]) {
        if (cntt[i] != 2) {
          printf("Keywet AK IOI\n");
          return;
        }
        cnt++;
      }
    }
  }
}
int main() {
  memset(head, 255, sizeof(head));
  memset(ehead, 255, sizeof(ehead));
  int i;
  char s[1000100];
  scanf("%s", s);
  n = strlen(s);
  for (i = 0; i < n; i++) {
    if (s[i] == '0')
      add(i, (i + 1) % n);
    else
      add((i + 1) % n, i);
  }
  topo();
  printf("%d\n", cnt);
  return 0;
}
