#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <vector>

using namespace std;

typedef long long int64;

static const int64 X = 3;
int64 XPOWK = 1;
int64 K_ONES = 0;
int64 XPOWK1 = 1;

vector<vector<int> > a;
map<int64, size_t> equiv_classes;

int main()
{
	ifstream in("complexity.in");
	ofstream out("complexity.out");
	size_t n, k;
	in >> n >> k;

	for (size_t i = 0; i < k; i++)
	{
		XPOWK *= X;
		K_ONES = K_ONES * X + 1;
		if (i != k - 1)
			XPOWK1 *= X;
	}

	a.resize(n);
	for (size_t i = 0; i < n; i++)
	{
		string s;
		in >> s;
		a[i] = vector<int>(n, 0);
		for (size_t j = 0; j < n; j++)
			a[i][j] = s[j] == 'b' ? 0 : 1;
	}
	for (size_t col = 0; col < n - k + 1; col++)
	{
		// Нормализация col-того столбца
		for (size_t i = 0; i < n; i++)
			if (a[i][col])
				for (size_t j = 0; j < n; j++)
					a[i][j] ^= 1;
		
		// Подсчёт начальных значений хешей для [0; k] x [col; col + k]
		vector<int64> hashes(k, 0);
		for (size_t i = 0; i < k; i++)
			for (size_t j = 0; j < k; j++)
				hashes[j] = hashes[j] * X + a[i][j + col];

		for (size_t i = 0; i < n - k + 1; i++)
		{
			// Подсчёт хеща для квадратика с левым верхним углом (i, col)
			int64 current_hash = 0;
			for (size_t j = 0; j < k; j++)
			{
				if (a[i][j + col] == 1)
					current_hash = current_hash * XPOWK + (K_ONES - hashes[j]);
				else
					current_hash = current_hash * XPOWK + hashes[j];
			}
			equiv_classes[current_hash]++;

			if (i == n - k)
				break;

			// Пересчёт
			for (size_t j = 0; j < k; j++)
				hashes[j] = (hashes[j] - XPOWK1 * a[i][j + col]) * X + a[i + k][j + col];
		}
	}

	// сумма попарных произведений равна одной второй разности квадрата суммы и суммы квадратов
	int64 sum = 0;
	int64 sumsq = 0;
	for (map<int64, size_t>::const_iterator it = equiv_classes.begin(); it != equiv_classes.end(); it++)
	{
		size_t now = it->second;
		sum += now;
		sumsq += now * now;
//		cerr << now << " ";
	}
	out << (sum * sum - sumsq) / 2;
}
