IndexOfを使って書き直してみました。

先日の記事:2009-10-12 - (ジラールのF)#関連。
筆者さんからのコメントに触発されてIndexOfを用いて書き直してみました。StringBuilderを使うのがポイントですね。そこそこ速いです。

    private static string get1DimCantorDust(int time)
    {
	if (time == 0) return "X";
	string c = get1DimCantorDust(time-1);
	return c + new String('.', c.Length) + c;
    }
    private static int numOverlap(string p, string patC)
    {
	int num = 0;
	for (int start = patC.IndexOf(p, 0); start != -1; start = patC.IndexOf(p,++start)) ++num;
	return num;
    }
    private static bool isBlank(string[] pat)
    {
        foreach (string p in pat) if (p.IndexOf('X') != -1) return false;
        return true;
    }
    public int occurrencesNumber(string[] pattern, int time)
    {
	StringBuilder projX = new StringBuilder(new String('.', pattern.Length));
	StringBuilder projY = new StringBuilder(new String('.', pattern[0].Length));
        for (int x = 0; x < pattern.Length; ++x)
            for (int y = 0; y < pattern[0].Length; ++y)
                if (pattern[x][y] == 'X') projX[x] = projY[y] = 'X';
        for (int x = 0; x < pattern.Length; ++x)
            for (int y = 0; y < pattern[0].Length; ++y)
                if ((pattern[x][y] == '.') && (projX[x] == 'X') && (projY[y] == 'X')) return 0;

        string patCantor = get1DimCantorDust(time);
        int mX = numOverlap(projX.ToString(), patCantor);
        int mY = numOverlap(projY.ToString(), patCantor);
        return !isBlank(pattern) ? mX * mY :
		mY * (patCantor.Length - pattern.Length + 1) +
		mX * (patCantor.Length - pattern[0].Length + 1) - mX * mY;
    }