#include <bits/stdc++.h>
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T>
T Max(T& a, T b) {
  return a = max(a, b);
}
template <class T>
T Min(T& a, T b) {
  return a = min(a, b);
}
template <class T1, class T2>
ostream& operator<<(ostream& o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream& operator<<(ostream& o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2>
istream& operator>>(istream& i, pair<T1, T2>& p) {
  return i >> p.first >> p.second;
}
template <class T>
ostream& operator<<(ostream& o, vector<T> a) {
  Int i = 0;
  for (T t : a) o << (i++ ? " " : "") << t;
  return o;
}
template <class T>
istream& operator>>(istream& i, vector<T>& a) {
  for (T& t : a) i >> t;
  return i;
}
_int used[2][200010], mem[2][200010];
const Int INF = 1e9;
signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);
  string str;
  cin >> str;
  Int N = str.size();
  const Int null = 29;
  function<Int(Int, Int)> dfs = [&](Int len, Int idx) {
    if (idx == N) return 0;
    if (used[len][idx]++) return mem[len][idx];
    Int a = -INF, b = -INF;
    char p1 = len == 2 ? str[idx - 2] - 'a' : 29;
    char p2 = idx > 0 ? str[idx - 1] - 'a' : 29;
    if (idx + 1 <= N) {
      Int ch1 = null;
      Int ch2 = str[idx] - 'a';
      if (p1 != ch1 || p2 != ch2) a = dfs(1, idx + 1) + 1;
    }
    if (idx + 2 <= N) {
      Int ch1 = str[idx] - 'a';
      Int ch2 = str[idx + 1] - 'a';
      if (p1 != ch1 || p2 != ch2) b = dfs(2, idx + 2) + 1;
    }
    Int res = max(a, b);
    return mem[len][idx] = res;
  };
  Int ans = dfs(0, 0);
  cout << ans << endl;
  return 0;
}
