Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

踏み台昇降

JAG大学に通う一樹君，通称カー君は，この夏友達であるあなたに誘われて，ICPC (International Collegiate Potchari Contest) に出場することになった．
ICPCは，スポーツ系のコンテストであり，高度な運動能力が必要とされる．
しかし，カー君はいつもパソコンの前にいてばかりで，少し動くだけでも疲れてしまうほどに運動不足だった．
そこでカー君は，ICPCでいい成績を残すための第1ステップとして，手軽に始められる運動，「踏み台昇降」を始めることにした．

踏み台昇降とは，その名の通り，踏み台と床との上り下りをただひたすら繰り返すだけの単純な運動である．
ただし，踏み台昇降では，正しい足の昇降を行わなければ，その効果を得ることはできない．
正しい昇降とは，以下の2種類の内いずれかを満たす足の動きである．

両足が床についた状態から，左足と右足を踏み台の上に上げて，踏み台の上に両足ともついた状態になる．左足と右足どちらを先に上げてもよい．

踏み台の上に両足ともついた状態から，左足と右足を床に下げて，両足が床についた状態になる．左足と右足どちらを先に下げてもよい．

以上からわかるように，床または踏み台の上にいる状態から連続で片足だけを上げ下げしても，正しい昇降とはならない．
踏み台昇降運動では，上記の正しい昇降の動きのいずれかを満たすとき，1回とカウントし，そのカウント数が大きければ大きいほど，効果を得ることができる．
床と踏み台を往復しなくても，片道だけで1回とカウントすることに注意してほしい．

あなたは，チームメイトであるカー君に少しでも強くなってほしいと考えている．
そこであなたは，カー君が踏み台昇降をさぼっていないか，プログラムを書いてチェックしてあげることにした．
カー君が踏み台昇降で動かした足の情報が与えられるので，正しく昇降を行った回数を求めよ．
ただし，両足とも床についている状態から踏み台昇降を始めるものとする．

Input

入力は，複数のデータセットから構成され，1つの入力に含まれるデータセットの数は150以下である．
各データセットの形式は次の通りである．

$n$
$f_1$ $f_2$ ... $f_n$

1行目で，足を動かした回数を表す整数 $n$ ($1 \le n \le 100$) が与えられる．
2行目で，足の動作を表す文字列である $f_i$ が時系列順に $n$ 個，スペース区切りで与えられる．
$f_i$ は，以下の4種類の文字列の内いずれかである．

"lu" : 左足を踏み台へ上げる．

"ru" : 右足を踏み台へ上げる．

"ld" : 左足を床へ下げる．

"rd" : 右足を床へ下げる．

床についている足をさらに下げるような動作や，踏み台についている足をさらに上げるような動作は入力されないと仮定してよい．

$n$ が0の行は入力の終わりを表す．このデータについては処理を行ってはならない．

Output

各データセットに対して，1行で正しい踏み台昇降を行った回数を出力せよ．
各行の終わりに改行を出力しない場合や，不必要な文字を出力する場合，誤答と判断されてしまうため注意すること．

Sample Input

4
lu ru ld rd
4
lu ld lu ru
1
lu
10
ru lu ld rd ru rd ru lu rd ld
0

Output for Sample Input

2
1
0
4

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using Solver.Ex;
using Debug = System.Diagnostics.Debug;
using Watch = System.Diagnostics.Stopwatch;
using StringBuilder = System.Text.StringBuilder;
//using System.Numerics;
namespace Solver
{

    public class Solver
    {

        public void Solve()
        {
            while(true)
            {
                var n = sc.Integer();
                if (n == 0) break;
                var a = sc.Scan(n);
                var l = false;
                var r = false;
                var f = false;
                var count = 0;
                foreach(var x in a)
                {
                    switch(x)
                    {
                        case "lu": l |= true; break;
                        case "ru": r |= true; break;
                        case "ld": l = false; break;
                        case "rd": r = false; break;
                    }
                    if (!f && (l && r))
                    {
                        f = true;
                        count++;
                    }
                    if(f &&!(l||r))
                    {
                        f = false;
                        count++;
                    }
                }
                IO.Printer.Out.WriteLine(count);
            }
        }


        internal IO.StreamScanner sc;
        static T[] Enumerate<T>(int n, Func<int, T> f) { var a = new T[n]; for (int i = 0; i < n; i++) a[i] = f(i); return a; }
    }

    #region Main and Settings
    static class Program
    {
        static void Main(string[] arg)
        {
#if DEBUG
            var errStream = new System.IO.FileStream(@"..\..\dbg.out", System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite);
            Debug.Listeners.Add(new System.Diagnostics.TextWriterTraceListener(errStream, "debugStream"));
            Debug.AutoFlush = false;
            var sw = new Watch(); sw.Start();
            IO.Printer.Out.AutoFlush = true;
            try
            {
#endif

                var solver = new Solver();
                solver.sc = new IO.StreamScanner(Console.OpenStandardInput());
                solver.Solve();
                IO.Printer.Out.Flush();
#if DEBUG
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.Message);
                Console.Error.WriteLine(ex.StackTrace);
            }
            finally
            {
                sw.Stop();
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Error.WriteLine("Time:{0}ms", sw.ElapsedMilliseconds);
                Debug.Close();
                System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
            }
#endif
        }


    }
    #endregion
}

#region IO Helper
namespace Solver.IO
{
    public class Printer : System.IO.StreamWriter
    {
        static Printer()
        {
            Out = new Printer(Console.OpenStandardOutput()) { AutoFlush = false };
#if DEBUG
            Error = new Printer(Console.OpenStandardError()) { AutoFlush = true };
#else
            Error = new Printer(System.IO.Stream.Null) { AutoFlush = false };
#endif
        }
        public static Printer Out { get; set; }
        public static Printer Error { get; set; }
        public override IFormatProvider FormatProvider { get { return System.Globalization.CultureInfo.InvariantCulture; } }
        public Printer(System.IO.Stream stream) : base(stream, new System.Text.UTF8Encoding(false, true)) { }
        public Printer(System.IO.Stream stream, System.Text.Encoding encoding) : base(stream, encoding) { }
        public void Write<T>(string format, IEnumerable<T> source) { Write(format, source.OfType<object>().ToArray()); }
        public void WriteLine<T>(string format, IEnumerable<T> source) { WriteLine(format, source.OfType<object>().ToArray()); }
    }
    public class StreamScanner
    {
        public StreamScanner(System.IO.Stream stream) { iStream = stream; }
        private readonly System.IO.Stream iStream;
        private readonly byte[] buf = new byte[1024];
        private int len, ptr;
        private bool eof = false;
        public bool IsEndOfStream { get { return eof; } }
        const byte lb = 33, ub = 126, el = 10, cr = 13;
        public byte read()
        {
            if (eof) throw new System.IO.EndOfStreamException();
            if (ptr >= len) { ptr = 0; if ((len = iStream.Read(buf, 0, 1024)) <= 0) { eof = true; return 0; } }
            return buf[ptr++];
        }
        public char Char() { byte b = 0; do b = read(); while (b < lb || ub < b);            return (char)b; }
        public char[] Char(int n) { var a = new char[n]; for (int i = 0; i < n; i++) a[i] = Char(); return a; }
        public char[][] Char(int n, int m) { var a = new char[n][]; for (int i = 0; i < n; i++) a[i] = Char(m); return a; }
        public string Scan()
        {
            if (eof) throw new System.IO.EndOfStreamException();
            StringBuilder sb = null;
            var enc = System.Text.UTF8Encoding.Default;
            do
            {
                for (; ptr < len && (buf[ptr] < lb || ub < buf[ptr]); ptr++) ;
                if (ptr < len) break;
                ptr = 0;
                if ((len = iStream.Read(buf, 0, 1024)) <= 0) { eof = true; return ""; }
            } while (true);
            do
            {
                var f = ptr;
                for (; ptr < len; ptr++)
                    if (buf[ptr] < lb || ub < buf[ptr])
                    //if (buf[ptr] == cr || buf[ptr] == el)
                    {
                        string s;
                        if (sb == null) s = enc.GetString(buf, f, ptr - f);
                        else { sb.Append(enc.GetChars(buf, f, ptr - f)); s = sb.ToString(); }
                        ptr++; return s;
                    }
                if (sb == null) sb = new StringBuilder(enc.GetString(buf, f, len - f));
                else sb.Append(enc.GetChars(buf, f, len - f));
                ptr = 0;

            }
            while (!eof && (len = iStream.Read(buf, 0, 1024)) > 0);
            eof = true; return (sb != null) ? sb.ToString() : "";
        }
        public long Long()
        {
            long ret = 0; byte b = 0; bool isMynus = false;
            const byte zr = 48, nn = 57, my = 45;
            do b = read();
            while (b != my && (b < zr || nn < b));
            if (b == my) { isMynus = true; b = read(); }
            for (; true; b = read())
                if (b < zr || nn < b)
                    return isMynus ? -ret : ret;
                else ret = ret * 10 + b - zr;
        }
        public int Integer()
        {
            int ret = 0; byte b = 0; bool isMynus = false;
            const byte zr = 48, nn = 57, my = 45;
            do b = read();
            while (b != my && (b < zr || nn < b));
            if (b == my) { isMynus = true; b = read(); }
            for (; true; b = read())
                if (b < zr || nn < b)
                    return isMynus ? -ret : ret;
                else ret = ret * 10 + b - zr;
        }
        public double Double() { return double.Parse(Scan(), System.Globalization.CultureInfo.InvariantCulture); }
        public string[] Scan(int n) { var a = new string[n]; for (int i = 0; i < n; i++) a[i] = Scan(); return a; }
        public double[] Double(int n) { var a = new double[n]; for (int i = 0; i < n; i++) a[i] = Double(); return a; }
        public int[] Integer(int n) { var a = new int[n]; for (int i = 0; i < n; i++) a[i] = Integer(); return a; }
        public long[] Long(int n) { var a = new long[n]; for (int i = 0; i < n; i++)a[i] = Long(); return a; }
        public void Flush() { iStream.Flush(); }
    }
}
#endregion
#region Extension
namespace Solver.Ex
{
    static public partial class EnumerableEx
    {
        static public string AsString(this IEnumerable<char> ie) { return new string(ie.ToArray()); }
        //static public string AsJoinedString<T>(this IEnumerable<T> ie, string st = " ") { return string.Join(st, ie); }
    }
}
#endregion