/* ex 8_2
   unomi */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//リストのノード（スタック内の各データ）の定義
typedef struct node{
    char elem;
    struct node *next;
} node;

//スタックにデータを追加
void push(node **first, char elem){
    //追加する分の領域を確保
    node *new = calloc(1, sizeof(node));
    if(new == NULL) exit(1);
    new->elem = elem;  // 要素を代入
    new->next = *first;  // 新しいノードの指す先にfirstの値を代入
    *first = new;  // firstを新しいノードに設定
}

//スタックからデータを取り出す
char pop(node **first){
    char elem;
    node *tmp = *first;
    if(tmp == NULL) exit(1);  // tmp(first)がNULLを指しているなら
    elem = tmp->elem;  //要素を取り出し
    *first = tmp->next;  // firstを手前に
    //取り出したノードのメモリを解放
    free(tmp);
    return elem;
}

int main(void){
    char sentence[10*10*10*10*10], trush;
    int cnt=0,prev_cnt=1,flag=0,f_flag=1;
    node **tmp;

    //最初のノードの指す先を設定
    node *first = NULL;

    // 入力の取得
    scanf("%s",sentence);

    // スタックに入力をプッシュ
    for(int i=0; i<strlen(sentence); i++) push(&first, sentence[i]);

    while(first->next != NULL){
        if(first->elem != (first->next)->elem){
            trush = pop(&first);
            trush = pop(&first);
            cnt+=2;
        }
        else if(first->next->next != NULL && (first->next)->elem != (first->next->next)->elem){
                trush = pop(&(first->next));
                trush = pop(&(first->next));
                cnt+=2;
            }
            else first = first-> next;
    }               

    printf("%d\n",cnt);

    return 0;
}

