Language: C++

#region いつもの
using System;
using System.Collections.Generic;
using System.Linq;
using IEnumerable = System.Collections.IEnumerable;
using IEnumerator = System.Collections.IEnumerator;
using BitArray = System.Collections.BitArray;
using BigInteger = System.Numerics.BigInteger;
using TextReader = System.IO.TextReader;
using static Global;
using static NumGlobal;

static class Global
{
    public static T[] NewArray<T>(int len0, T value) => new T[len0].Fill(value);
    public static T[] NewArray<T>(int len0, Func<T> factory)
    {
        var arr = new T[len0];
        for (int i = 0; i < arr.Length; i++) arr[i] = factory();
        return arr;
    }
    public static T[][] NewArray<T>(int len0, int len1, T value) where T : struct
    {
        var arr = new T[len0][];
        for (int i = 0; i < arr.Length; i++) arr[i] = NewArray(len1, value);
        return arr;
    }
    public static T[][] NewArray<T>(int len0, int len1, Func<T> factory)
    {
        var arr = new T[len0][];
        for (int i = 0; i < arr.Length; i++) arr[i] = NewArray(len1, factory);
        return arr;
    }
    public static T[][][] NewArray<T>(int len0, int len1, int len2, T value) where T : struct
    {
        var arr = new T[len0][][];
        for (int i = 0; i < arr.Length; i++) arr[i] = NewArray(len1, len2, value);
        return arr;
    }
    public static T[][][] NewArray<T>(int len0, int len1, int len2, Func<T> factory)
    {
        var arr = new T[len0][][];
        for (int i = 0; i < arr.Length; i++) arr[i] = NewArray(len1, len2, factory);
        return arr;
    }
    public static T[][][][] NewArray<T>(int len0, int len1, int len2, int len3, T value) where T : struct
    {
        var arr = new T[len0][][][];
        for (int i = 0; i < arr.Length; i++) arr[i] = NewArray(len1, len2, len3, value);
        return arr;
    }
    public static T[][][][] NewArray<T>(int len0, int len1, int len2, int len3, Func<T> factory)
    {
        var arr = new T[len0][][][];
        for (int i = 0; i < arr.Length; i++) arr[i] = NewArray(len1, len2, len3, factory);
        return arr;
    }
    private class ComparerReverseImpl<T> : Comparer<T> where T : IComparable<T> { public override int Compare(T y, T x) => x.CompareTo(y); public override bool Equals(object obj) => obj != null && GetType() == obj.GetType(); public override int GetHashCode() => GetType().GetHashCode(); }
    public static IComparer<T> ComparerReverse<T>() where T : IComparable<T> => new ComparerReverseImpl<T>();
    public static string AllLines<T>(IEnumerable<T> source) => string.Join("\n", source);
    public static string AllJoin<T>(IEnumerable<T> source) => string.Join(" ", source);
}
static class NumGlobal
{
    public static int Pow(int x, int y)
    {
        int res = 1;
        for (; y > 0; y >>= 1)
        {
            if ((y & 1) == 1) res *= x;
            x *= x;
        }
        return res;
    }
    public static BigInteger ParseBigInteger(string s)
    {
        // MonoのBigInteger.Parseが遅いので自前実装
        var res = BigInteger.Zero;
        var splited = new string[(s.Length + 7) / 8];
        for (var i = 0; i < splited.Length - 1; i++)
        {
            splited[i] = s.Substring(8 * i, 8);
        }
        splited[splited.Length - 1] = s.Substring(8 * (splited.Length - 1));
        foreach (var sp in splited)
        {
            res *= (int)Math.Pow(10, sp.Length);
            res += int.Parse(sp);
        }
        return res;
    }
    public static int BitCount(int x) { x -= (x >> 1) & 0x55555555; x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0f0f0f0f; x += x >> 8; x += x >> 16; return x & 0x3f; }
    public static int BitCount(long x) { x -= (x >> 1) & 0x5555555555555555; x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333); x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0f; x += x >> 8; x += x >> 16; x += x >> 32; return (int)(x & 0x0000007f); }
    public static int MSB(int x) { x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return BitCount(x) - 1; }
    public static int MSB(long x) { x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; x |= x >> 32; return BitCount(x) - 1; }
    public static int LSB(int x) { x |= x << 1; x |= x << 2; x |= x << 4; x |= x << 8; x |= x << 16; return 32 - BitCount(x); }
    public static int LSB(long x) { x |= x << 1; x |= x << 2; x |= x << 4; x |= x << 8; x |= x << 16; x |= x << 32; return 64 - BitCount(x); }
}
static class Ext
{
    public static T[] Fill<T>(this T[] arr, T value)
    {
        for (var i = 0; i < arr.Length; i++) arr[i] = value;
        return arr;
    }
    public static T[] Sort<T>(this T[] arr)
    {
        Array.Sort(arr);
        return arr;
    }
    public static string[] Sort(this string[] arr)
    {
        Array.Sort(arr, StringComparer.OrdinalIgnoreCase);
        return arr;
    }
    public static T[] Reverse<T>(this T[] arr)
    {
        Array.Reverse(arr);
        return arr;
    }

    public static Tuple<TSource, TMax> MaxBy<TSource, TMax>
        (this IEnumerable<TSource> source, Func<TSource, TMax> maxBySelector)
        where TMax : IComparable<TMax>
    {
        TMax max;
        TSource maxByItem;

        var e = source.GetEnumerator();
        e.MoveNext();
        maxByItem = e.Current;
        max = maxBySelector(maxByItem);
        while (e.MoveNext())
        {
            var item = e.Current;
            var next = maxBySelector(item);
            if (max.CompareTo(next) < 0)
            {
                max = next;
                maxByItem = item;
            }
        }
        return Tuple.Create(maxByItem, max);
    }
    public static Tuple<TSource, TMin> MinBy<TSource, TMin>
        (this IEnumerable<TSource> source, Func<TSource, TMin> minBySelector)
        where TMin : IComparable<TMin>
    {
        TMin min;
        TSource minByItem;

        var e = source.GetEnumerator();
        e.MoveNext();
        minByItem = e.Current;
        min = minBySelector(minByItem);
        while (e.MoveNext())
        {
            var item = e.Current;
            var next = minBySelector(item);
            if (min.CompareTo(next) > 0)
            {
                min = next;
                minByItem = item;
            }
        }
        return Tuple.Create(minByItem, min);
    }
    public static IComparer<T> Reverse<T>(this IComparer<T> comparer) => Comparer<T>.Create((x, y) => comparer.Compare(y, x));
    public static Dictionary<TKey, int> GroupCount<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) => source.GroupBy(keySelector).ToDictionary(g => g.Key, g => g.Count());
    public static Dictionary<TKey, int> GroupCount<TKey>(this IEnumerable<TKey> source) => source.GroupCount(i => i);
}
#pragma warning disable CA1819
[System.Diagnostics.DebuggerNonUserCode]
public class ConsoleReader { private string[] ReadLineSplit() => textReader.ReadLine().Split(Array.Empty<char>(), StringSplitOptions.RemoveEmptyEntries); private string[] line = Array.Empty<string>(); private int linePosition; private TextReader textReader; public ConsoleReader(TextReader tr) { textReader = tr; } public int Int => int.Parse(String); public int Int0 => Int - 1; public long Long => long.Parse(String); public double Double => double.Parse(String); public string String { get { if (linePosition >= line.Length) { linePosition = 0; line = ReadLineSplit(); } return line[linePosition++]; } } public class SplitLine { public SplitLine(ConsoleReader cr) { String = cr.ReadLineSplit(); cr.line = Array.Empty<string>(); } public int[] Int => String.Select(x => int.Parse(x)).ToArray(); public int[] Int0 => String.Select(x => int.Parse(x) - 1).ToArray(); public long[] Long => String.Select(x => long.Parse(x)).ToArray(); public double[] Double => String.Select(x => double.Parse(x)).ToArray(); public string[] String { get; } } public SplitLine Split => new SplitLine(this); public class RepeatReader { ConsoleReader cr; int count; public RepeatReader(ConsoleReader cr, int count) { this.cr = cr; this.count = count; } public T[] Select<T>(Func<ConsoleReader, T> factory) { var arr = new T[count]; for (int i = 0; i < count; i++) arr[i] = factory(cr); return arr; } public string[] String => this.Select(cr => cr.String); public int[] Int => this.Select(cr => cr.Int); public int[] Int0 => this.Select(cr => cr.Int - 1); public long[] Long => this.Select(cr => cr.Long); public double[] Double => this.Select(cr => cr.Double); } public RepeatReader Repeat(int count) => new RepeatReader(this, count); }
public class Program
{
    [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)] private ConsoleReader cr;

    public Program(ConsoleReader consoleReader) { this.cr = consoleReader; }
    static void Main() => Console.WriteLine(new Program(new ConsoleReader(Console.In)).Calc());

    #endregion
    public object Calc()
    {
        var H = cr.Int;
        var W = cr.Int;
        var grid = NewArray(H, () => cr.String);

        uf = new UnionFind(H * W);
        for (int h = 0; h < H; h++)
            for (int w = 0; w < W; w++)
            {
                var cur = h * W + w;
                if (w + 1 < W && grid[h][w] != grid[h][w + 1])
                    uf.UnionSet(cur, cur + 1);
                if (h + 1 < H && grid[h][w] != grid[h + 1][w])
                    uf.UnionSet(cur, cur + W);
            }

        var g = Enumerable.Range(0, H * W).Select(i => uf.Root(i) + (grid[i / W][i % W] == '#' ? 2000000 : 0)).GroupCount();
        var cnt = 0;
        foreach (var pair in g)
            if (pair.Key < 2000000)
            {
                int v;
                g.TryGetValue(pair.Key + 2000000, out v);
                cnt += pair.Value * v;
            }


        return cnt;
    }
    UnionFind uf;
}
class UnionFind
{
    int[] data;
    public UnionFind(int size)
    {
        this.data = Enumerable.Repeat(-1, size).ToArray();
    }

    public int Root(int x)
    {
        if (data[x] < 0) return x;
        return data[x] = Root(data[x]);
    }
    public int Count(int x) => -data[Root(x)];
    public void UnionSet(int x, int y)
    {
        var xRoot = Root(x);
        var yRoot = Root(y);
        if (xRoot == yRoot) return;
        else if (data[yRoot] < data[xRoot])//y側の方が多い場合は逆にする
        {
            var tmp = yRoot;
            yRoot = xRoot;
            xRoot = tmp;
        }
        data[xRoot] += data[yRoot];
        data[yRoot] = xRoot;
    }
    public bool IsSameSet(int x, int y) => Root(x) == Root(y);
}


Compiler output:
a.cc:1:2: error: invalid preprocessing directive #region
    1 | #region いつもの
      |  ^~~~~~
a.cc:182:6: error: invalid preprocessing directive #endregion
  182 |     #endregion
      |      ^~~~~~~~~
a.cc:2:7: error: expected nested-name-specifier before 'System'
    2 | using System;
      |       ^~~~~~
a.cc:3:7: error: expected nested-name-specifier before 'System'
    3 | using System.Collections.Generic;
      |       ^~~~~~
a.cc:4:7: error: expected nested-name-specifier before 'System'
    4 | using System.Linq;
      |       ^~~~~~
a.cc:5:21: error: 'System' does not name a type
    5 | using IEnumerable = System.Collections.IEnumerable;
      |                     ^~~~~~
a.cc:6:21: error: 'System' does not name a type
    6 | using IEnumerator = System.Collections.IEnumerator;
      |                     ^~~~~~
a.cc:7:18: error: 'System' does not name a type
    7 | using BitArray = System.Collections.BitArray;
      |                  ^~~~~~
a.cc:8:20: error: 'System' does not name a type
    8 | using BigInteger = System.Numerics.BigInteger;
      |                    ^~~~~~
a.cc:9:20: error: 'System' does not name a type
    9 | using TextReader = System.IO.TextReader;
      |                    ^~~~~~
a.cc:10:7: error: expected nested-name-specifier before 'static'
   10 | using static Global;
      |       ^~~~~~
a.cc:11:7: error: expected nested-name-specifier before 'static'
   11 | using static NumGlobal;
      |       ^~~~~~
a.cc:15:11: error: expected ':' before 'static'
   15 |     public static T[] NewArray<T>(int len0, T value) => new T[len0].Fill(value);
      |           ^~~~~~~
      |           :
a.cc:15:19: error: 'T' does not name a type
   15 |     public static T[] NewArray<T>(int len0, T value) => new T[len0].Fill(value);
      |                   ^
a.cc:16:11: error: expected ':' before 'static'
   16 |     public static T[] NewArray<T>(int len0, Func<T> factory)
      |           ^~~~~~~
      |           :
a.cc:16:19: error: 'T' does not name a type
   16 |     public static T[] NewArray<T>(int len0, Func<T> factory)
      |                   ^
a.cc:22:11: error: expected ':' before 'static'
   22 |     public static T[][] NewArray<T>(int len0, int len1, T value) where T : struct
      |           ^~~~~~~
      |           :
a.cc:22:19: error: 'T' does not name a type
   22 |     public static T[][] NewArray<T>(int len0, int len1, T value) where T : struct
      |                   ^
a.cc:28:11: error: expected ':' before 'static'
   28 |     public static T[][] NewArray<T>(int len0, int len1, Func<T> factory)
      |           ^~~~~~~
      |           :
a.cc:28:19: error: 'T' does not name a type
   28 |     public static T[][] NewArray<T>(int len0, int len1, Func<T> factory)
      |                   ^
a.cc:34:11: error: expected ':' before 'static'
   34 |     public static T[][][] NewArray<T>(int len0, int len1, int len2, T value) where T : struct
      |           ^~~~~~~
      |           :
a.cc:34:19: error: 'T' does not name a type
   34 |     public static T[][][] NewArray<T>(int len0, int len1, int len2, T value) where T : struct
      |                   ^
a.cc:40:11: error: expected ':' before 'static'
   40 |     public static T[][][] NewArray<T>(int len0, int len1, int len2, Func<T> factory)
      |           ^~~~~~~
      |           :
a.cc:40:19: error: 'T' does not name a type
   40 |     public static T[][][] NewArray<T>(int len0, int len1, int len2, Func<T> factory)
      |                   ^
a.cc:46:11: error: expected ':' before 'static'
   46 |     public static T[][][][] NewArray<T>(int len0, int len1, int len2, int len3, T value) where T : struct
      |           ^~~~~~~
      |           :
a.cc:46:19: error: 'T' does not name a type
   46 |     public static T[][][][] NewArray<T>(int len0, int len1, int len2, int len3, T value) where T : struct
      |                   ^
a.cc:52:11: error: expected ':' before 'static'
   52 |     public static T[][][][] NewArray<T>(int len0, int len1, int len2, int len3, Func<T> factory)
      |           ^~~~~~~
      |           :
a.cc:52:19: error: 'T' does not name a type
   52 |     public static T[][][][] NewArray<T>(int len0, int len1, int len2, int len3, Func<T> factory)
      |                   ^
a.cc:58:12: error: expected ':' before 'class'
   58 |     private class ComparerReverseImpl<T> : Comparer<T> where T : IComparable<T> { public override int Compare(T y, T x) => x.CompareTo(y); public override bool Equals(object obj) => obj != null && GetType() == obj.GetType(); public override int GetHashCode() => GetType().GetHashCode(); }
      |            ^~~~~~
      |            :
a.cc:58:19: error: 'ComparerReverseImpl' is not a class template
   58 |     private class ComparerReverseImpl<T> : Comparer<T> where T : IComparable<T> { public override int Compare(T y, T x) => x.CompareTo(y); public override bool Equals(object obj) => obj != null && GetType() == obj.GetType(); public override int GetHashCode() => GetType().GetHashCode(); }
      |                   ^~~~~~~~~~~~~~~~~~~
a.cc:58:39: error: 'T' was not declared in this scope
   58 |     private class ComparerReverseImpl<T> : Comparer<T> where T : IComparable<T> { public override int Compare(T y, T x) => x.CompareTo(y); public override bool Equals(object obj) => obj != null && GetType() == obj.GetType(); public override int GetHashCode() => GetType().GetHashCode(); }
      |                                       ^
a.cc:58:52: error: expected template-name before '<' token
   58 |     private class ComparerReverseImpl<T> : Comparer<T> where T : IComparable<T> { public override int Compare(T y, T x) => x.CompareTo(y); public override bool Equals(object obj) => obj != null && GetType() == obj.GetType(); public override int GetHashCode() => GetType().GetHashCode(); }
      |                                                    ^
a.cc:58:52: error: expected '{' before '<' token
a.cc:58:52: error: expected unqualified-id before '<' token
a.cc:59:11: error: expected ':' before 'static'
   59 |     public static IComparer<T> ComparerReverse<T>() where T : IComparable<T> => new ComparerReverseImpl<T>();
      |           ^~~~~~~
      |           :
a.cc:59:19: error: 'IComparer' does not name a type
   59 |     public static IComparer<T> ComparerReverse<T>() where T : IComparable<T> => new ComparerReverseImpl<T>();
      |                   ^~~~~~~~~
a.cc:60:11: error: expected ':' before 'static'
   60 |     public static string AllLines<T>(IEnumerable<T> source) => string.Join("\n", source);
      |           ^~~~~~~
      |           :
a.cc:60:19: error: 'string' does not name a type
   60 |     public static string AllLines<T>(IEnumerable<T> source) => string.Join("\n", source);
      |                   ^~~~~~
a.cc:61:11: error: expected ':' before 'static'
   61 |     public static string AllJoin<T>(IEnumerable<T> source) => string.Join(" ", source);
      |           ^~~~~~~
      |           :
a.cc:61:19: error: 'string' does not name a type
   61 |     public static string AllJoin<T>(IEnumerable<T> source) => string.Join(" ", source);
      |                   ^~~~~~
a.cc:62:2: error: expected ';' after class definition
   62 | }
      |  ^
      |  ;
a.cc:13:1: error: a storage class can only be specified for objects and functions
   13 | static class Global
      | ^~~~~~
a.cc:65:11: error: expected ':' before 'static'
   65 |     public static int Pow(int x, int y)
      |           ^~~~~~~
      |           :
a.cc:75:11: error: expected ':' before 'static'
   75 |     public static BigInteger ParseBigInteger(string s)
      |           ^~~~~~~
      |           :
a.cc:75:19: error: 'BigInteger' does not name a type
   75 |     public static BigInteger ParseBigInteger(string s)
      |                   ^~~~~~~~~~
a.cc:92:11: error: expected ':' before 'static'
   92 |     public static int BitCount(int x) { x -= (x >> 1) & 0x55555555; x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0f0f0f0f; x += x >> 8; x += x >> 16; return x & 0x3f; }
      |           ^~~~~~~
      |           :
a.cc:93:11: error: expected ':' before 'static'
   93 |     public static int BitCount(long x) { x -= (x >> 1) & 0x5555555555555555; x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333); x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0f; x += x >> 8; x += x >> 16; x += x >> 32; return (int)(x & 0x0000007f); }
      |           ^~~~~~~
      |           :
a.cc:94:11: error: expected ':' before 'static'
   94 |     public static int MSB(int x) { x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return BitCount(x) - 1; }
      |           ^~~~~~~
      |           :
a.cc:95:11: error: expected ':' before 'static'
   95 |     public static int MSB(long x) { x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; x |= x >> 32; return BitCount(x) - 1; }
      |           ^~~~~~~
      |           :
a.cc:96:11: error: expected ':' before 'static'
   96 |     public static int LSB(int x) { x |= x << 1; x |= x << 2; x |= x << 4; x |= x << 8; x |= x << 16; return 32 - BitCount(x); }
      |           ^~~~~~~
      |           :
a.cc:97:11: error: expected ':' before 'static'
   97 |     public static int LSB(long x) { x |= x << 1; x |= x << 2; x |= x << 4; x |= x << 8; x |= x << 16; x |= x << 32; return 64 - BitCount(x); }
      |           ^~~~~~~
      |           :
a.cc:98:2: error: expected ';' after class definition
   98 | }
      |  ^
      |  ;
a.cc:63:1: error: a storage class can only be specified for objects and functions
   63 | static class NumGlobal
      | ^~~~~~
a.cc:101:11: error: expected ':' before 'static'
  101 |     public static T[] Fill<T>(this T[] arr, T value)
      |           ^~~~~~~
      |           :
a.cc:101:19: error: 'T' does not name a type
  101 |     public static T[] Fill<T>(this T[] arr, T value)
      |                   ^
a.cc:106:11: error: expected ':' before 'static'
  106 |     public static T[] Sort<T>(this T[] arr)
      |           ^~~~~~~
      |           :
a.cc:106:19: error: 'T' does not name a type
  106 |     public static T[] Sort<T>(this T[] arr)
      |                   ^
a.cc:111:11: error: expecte