/*  ex9_2
    Rikuta  */
#include <stdio.h>
#include <stdlib.h>
// リストのノード（スタック内の各データ）の定義
typedef struct node
{
    char elem;
    struct node *next;
} node;

//プロトタイプ宣言
void push(node **cube, char elem);
void pop(node **cube);
char last(node **cube);

int main(void)
{   
    //最初のノードがさす先．
    node *cube = NULL;
    //countの初期化
    int count = 0;
    while (1)
    {   
        //一時的な文字の宣言
        char temp_char;
        //入力
        scanf("%c", &temp_char);
        //改行で終了
        if (temp_char=='\n')
        {
            break;
        }
        if (temp_char!=last(&cube))
        {   
            pop(&cube);
            count+=2;
        }
        else
        {   
            push(&cube, temp_char);
        }
    }
    //countを出力
    printf("%d\n", count);
    return 0;
}

//スタックにデータを追加
void push(node **cube, char elem)
{
    //追加する分の領域を確保
    node *new = calloc(1, sizeof(node));
    //確保できないならエラー
    if (new == NULL)
        exit(1);
    //新しいデータの要素はelemでそれに続くものはcubeとなる
    new->elem = elem;
    new->next = *cube;
    //新しいノードが1番目に更新される．
    *cube = new;
}

//スタックからデータを取り出す
void pop(node **cube)
{
    node *tmp = *cube;
    //データがなければエラー
    if (tmp == NULL)
        exit(1);
    //cubeを次のノードに移行させる
    *cube = tmp->next;
    //取り出したノードのメモリを解放
    free(tmp);
}

//スタックの最初を参照する．
char last(node **cube)
{
    //最初の文字が入る変数の宣言
    char elem;
    node *tmp = *cube;
    //データがなければ'-'を返す．
    if (tmp == NULL)
        return '-';
    //データの最初をelemとして返す
    elem = tmp->elem;
    return elem;
}
