import sys

## io ##

def IS(): return sys.stdin.readline().rstrip()

def II(): return int(IS())

def MII(): return list(map(int, IS().split()))

def MIIZ(): return list([x-1 for x in MII()])

## dp ##

def DD2(d1,d2,init=0): return [[init]*d2 for _ in range(d1)]

def DD3(d1,d2,d3,init=0): return [DD2(d2,d3,init) for _ in range(d1)]

## math ##

def to_bin(x: int) -> str: return format(x, 'b') # rev => int(res, 2)

def to_oct(x: int) -> str: return format(x, 'o') # rev => int(res, 8)

def to_hex(x: int) -> str: return format(x, 'x') # rev => int(res, 16)

MOD=10**9+7

def divc(x,y) -> int: return -(-x//y)

def divf(x,y) -> int: return x//y

def gcd(x,y):

    while y: x,y = y,x%y

    return x

def lcm(x,y): return x*y//gcd(x,y)

def enumerate_divs(n):

    """Return a tuple list of divisor of n"""

    return [(i,n//i) for i in range(1,int(n**0.5)+1) if n%i==0]

def get_primes(MAX_NUM=10**3):

    """Return a list of prime numbers n or less"""

    is_prime = [True]*(MAX_NUM+1)

    is_prime[0] = is_prime[1] = False

    for i in range(2, int(MAX_NUM**0.5)+1):

        if not is_prime[i]: continue

        for j in range(i*2, MAX_NUM+1, i):

            is_prime[j] = False

    return [i for i in range(MAX_NUM+1) if is_prime[i]]

## libs ##

from itertools import accumulate as acc

from collections import deque, Counter

from heapq import heapify, heappop, heappush

from bisect import bisect_left

#======================================================#



def main():

    s = IS()

    n = len(s)

    dp = DD2(n,4)

    dp[0][0] = 1

    dp[1][1] = 1

    for i in range(1, n):

        if s[i-1] != s[i]:

            dp[i][0] = max(dp[i-1][0], dp[i-1][2]) + 1

        if i < n-1:

            dp[i+1][1] = max(dp[i-1][0], dp[i-1][2]) + 1

        dp[i][2] = max(dp[i-1][1], dp[i-1][3]) + 1

        if 2 <= i < n-1 and (s[i-2] != s[i] or s[i-1] != s[i+1]):

            dp[i+1][3] = max(dp[i-1][1], dp[i-1][3]) + 1

    print((max(dp[-1])))





if __name__ == '__main__':

    main()
import sys

## io ##

def IS(): return sys.stdin.readline().rstrip()

def II(): return int(IS())

def MII(): return list(map(int, IS().split()))

def MIIZ(): return list([x-1 for x in MII()])

## dp ##

def DD2(d1,d2,init=0): return [[init]*d2 for _ in range(d1)]

def DD3(d1,d2,d3,init=0): return [DD2(d2,d3,init) for _ in range(d1)]

## math ##

def to_bin(x: int) -> str: return format(x, 'b') # rev => int(res, 2)

def to_oct(x: int) -> str: return format(x, 'o') # rev => int(res, 8)

def to_hex(x: int) -> str: return format(x, 'x') # rev => int(res, 16)

MOD=10**9+7

def divc(x,y) -> int: return -(-x//y)

def divf(x,y) -> int: return x//y

def gcd(x,y):

    while y: x,y = y,x%y

    return x

def lcm(x,y): return x*y//gcd(x,y)

def enumerate_divs(n):

    """Return a tuple list of divisor of n"""

    return [(i,n//i) for i in range(1,int(n**0.5)+1) if n%i==0]

def get_primes(MAX_NUM=10**3):

    """Return a list of prime numbers n or less"""

    is_prime = [True]*(MAX_NUM+1)

    is_prime[0] = is_prime[1] = False

    for i in range(2, int(MAX_NUM**0.5)+1):

        if not is_prime[i]: continue

        for j in range(i*2, MAX_NUM+1, i):

            is_prime[j] = False

    return [i for i in range(MAX_NUM+1) if is_prime[i]]

## libs ##

from itertools import accumulate as acc

from collections import deque, Counter

from heapq import heapify, heappop, heappush

from bisect import bisect_left

#======================================================#



def main():

    s = IS()

    n = len(s)

    dp = DD2(n,2)

    dp[0][0] = 1

    dp[0][1] = -1

    for i in range(1, n):

        if s[i-1] == s[i]:

            dp[i][0] = dp[i-1][1] + 1

        else:

            dp[i][0] = max(dp[i-1][0], dp[i-1][1]) + 1

        if i-2>=0:

            dp[i][1] = max(dp[i-2][0], dp[i-2][1])+1

    print((max(dp[-1][0],dp[-1][1])))





if __name__ == '__main__':

    main()
import sys

## io ##
def IS():
    return sys.stdin.readline().rstrip()


def II():
    return int(IS())


def MII():
    return list(map(int, IS().split()))


def MIIZ():
    return list([x - 1 for x in MII()])


## dp ##
def DD2(d1, d2, init=0):
    return [[init] * d2 for _ in range(d1)]


def DD3(d1, d2, d3, init=0):
    return [DD2(d2, d3, init) for _ in range(d1)]


## math ##
def to_bin(x: int) -> str:
    return format(x, "b")  # rev => int(res, 2)


def to_oct(x: int) -> str:
    return format(x, "o")  # rev => int(res, 8)


def to_hex(x: int) -> str:
    return format(x, "x")  # rev => int(res, 16)


MOD = 10**9 + 7


def divc(x, y) -> int:
    return -(-x // y)


def divf(x, y) -> int:
    return x // y


def gcd(x, y):
    while y:
        x, y = y, x % y
    return x


def lcm(x, y):
    return x * y // gcd(x, y)


def enumerate_divs(n):
    """Return a tuple list of divisor of n"""
    return [(i, n // i) for i in range(1, int(n**0.5) + 1) if n % i == 0]


def get_primes(MAX_NUM=10**3):
    """Return a list of prime numbers n or less"""
    is_prime = [True] * (MAX_NUM + 1)
    is_prime[0] = is_prime[1] = False
    for i in range(2, int(MAX_NUM**0.5) + 1):
        if not is_prime[i]:
            continue
        for j in range(i * 2, MAX_NUM + 1, i):
            is_prime[j] = False
    return [i for i in range(MAX_NUM + 1) if is_prime[i]]


## libs ##
from itertools import accumulate as acc
from collections import deque, Counter
from heapq import heapify, heappop, heappush
from bisect import bisect_left

# ======================================================#
def main():
    s = IS()
    n = len(s)
    dp = DD2(n, 4)
    dp[0][0] = 1
    dp[1][1] = 1
    for i in range(1, n):
        if s[i - 1] != s[i]:
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][2]) + 1
        if i < n - 1:
            dp[i + 1][1] = max(dp[i - 1][0], dp[i - 1][2]) + 1
        dp[i][2] = max(dp[i - 1][1], dp[i - 1][3]) + 1
        if 2 <= i < n - 1 and (s[i - 2] != s[i] or s[i - 1] != s[i + 1]):
            dp[i + 1][3] = max(dp[i - 1][1], dp[i - 1][3]) + 1
    print((max(dp[-1])))


if __name__ == "__main__":
    main()

import sys

## io ##
def IS():
    return sys.stdin.readline().rstrip()


def II():
    return int(IS())


def MII():
    return list(map(int, IS().split()))


def MIIZ():
    return list([x - 1 for x in MII()])


## dp ##
def DD2(d1, d2, init=0):
    return [[init] * d2 for _ in range(d1)]


def DD3(d1, d2, d3, init=0):
    return [DD2(d2, d3, init) for _ in range(d1)]


## math ##
def to_bin(x: int) -> str:
    return format(x, "b")  # rev => int(res, 2)


def to_oct(x: int) -> str:
    return format(x, "o")  # rev => int(res, 8)


def to_hex(x: int) -> str:
    return format(x, "x")  # rev => int(res, 16)


MOD = 10**9 + 7


def divc(x, y) -> int:
    return -(-x // y)


def divf(x, y) -> int:
    return x // y


def gcd(x, y):
    while y:
        x, y = y, x % y
    return x


def lcm(x, y):
    return x * y // gcd(x, y)


def enumerate_divs(n):
    """Return a tuple list of divisor of n"""
    return [(i, n // i) for i in range(1, int(n**0.5) + 1) if n % i == 0]


def get_primes(MAX_NUM=10**3):
    """Return a list of prime numbers n or less"""
    is_prime = [True] * (MAX_NUM + 1)
    is_prime[0] = is_prime[1] = False
    for i in range(2, int(MAX_NUM**0.5) + 1):
        if not is_prime[i]:
            continue
        for j in range(i * 2, MAX_NUM + 1, i):
            is_prime[j] = False
    return [i for i in range(MAX_NUM + 1) if is_prime[i]]


## libs ##
from itertools import accumulate as acc
from collections import deque, Counter
from heapq import heapify, heappop, heappush
from bisect import bisect_left

# ======================================================#
def main():
    s = IS()
    n = len(s)
    dp = DD2(n, 2)
    dp[0][0] = 1
    dp[0][1] = -1
    for i in range(1, n):
        if s[i - 1] == s[i]:
            dp[i][0] = dp[i - 1][1] + 1
        else:
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]) + 1
        if i - 2 >= 0:
            dp[i][1] = max(dp[i - 2][0], dp[i - 2][1]) + 1
    print((max(dp[-1][0], dp[-1][1])))


if __name__ == "__main__":
    main()

-    dp = DD2(n, 4) +    dp = DD2(n, 2) -    dp[1][1] = 1 +    dp[0][1] = -1 -        if s[i - 1] != s[i]: -            dp[i][0] = max(dp[i - 1][0], dp[i - 1][2]) + 1 -        if i < n - 1: -            dp[i + 1][1] = max(dp[i - 1][0], dp[i - 1][2]) + 1 -        dp[i][2] = max(dp[i - 1][1], dp[i - 1][3]) + 1 -        if 2 <= i < n - 1 and (s[i - 2] != s[i] or s[i - 1] != s[i + 1]): -            dp[i + 1][3] = max(dp[i - 1][1], dp[i - 1][3]) + 1 -    print((max(dp[-1]))) +        if s[i - 1] == s[i]: +            dp[i][0] = dp[i - 1][1] + 1 +        else: +            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]) + 1 +        if i - 2 >= 0: +            dp[i][1] = max(dp[i - 2][0], dp[i - 2][1]) + 1 +    print((max(dp[-1][0], dp[-1][1])))