Problem:
String Compression

Problem

アルファベットの小文字と数字からなる文字列 S が与えられる。次の手順で文字列 S の長さを圧縮する。

文字列内の文字の順番を任意の順番に入れ替える。

例: "0ig3he12fz99" → "efghiz012399"

次の操作を任意の回数行う。

文字列内にある、"abcdefghijklmnopqrstuvwxyz"の連続した部分文字列を選び、(先頭の文字)'-'(末尾の文字)に置き換える。

例: "efghiz012399" → "e-iz012399"

文字列内にある、公差が1であるような数字列("0123456789"の連続した部分文字列)を選び、(先頭の数字)'-'(末尾の数字)に置き換える。

例: "e-iz012399" → "e-iz0-399"

文字列 S を圧縮して得られる文字列の長さの最小値を求めよ。

Input

文字列 S が１行で与えられる。

Constraints

1 ≤ |S| ≤ 100

文字列Sはアルファベットの小文字と数字のみを含む

Output

文字列 S を圧縮して得られる文字列の長さの最小値を1行に出力せよ。圧縮できない場合は元の文字列 S の長さを出力せよ。

Sample Input 1

0ig3he12fz99

Sample Output 1

9

Sample Input 2

1122334455

Sample Output 2

6

Solution in C# (judge verdict: Accepted)

using System.Linq;
using System.Collections.Generic;
using System;

public class Hello
{
    public static void Main()
    {
        var w = "abcdefghijklmnopqrstuvwxyz";
        var d = new Dictionary<char, int>();
        for (int i = 0; i < 26; i++) d[w[i]] = i;
        var a = new int[26];
        var b = new int[10];
        var s = Console.ReadLine().Trim();
        for (int i = 0; i < s.Length; i++)
        {
            int tp;
            if (int.TryParse(s[i].ToString(), out tp)) b[tp]++;
            else a[d[s[i]]]++;
        }
        var ret = getAns(a);
        var ret2 = getAns(b);
        Console.WriteLine(ret + ret2);
    }
    public static int getAns(int[] a)
    {
        var asum = a.Sum();
        if (asum == 0) return 0;
        var aL = a.Length;
        var sumc = 0; var count = 0;
        while (true)
        {
            var nowL = 0;
            var discov = false;
            for (int i = 0; i < aL; i++)
            {
                if (a[i] >= 1) { nowL++; a[i]--; }
                else
                {
                    if (nowL >= 4) { count++; sumc += nowL; discov = true; }
                    nowL = 0;
                }
            }
            if (nowL >= 4) { count++; sumc += nowL; discov = true; }
            if (!discov) break;
        }
        return asum - (sumc - 3 * count);
    }
}