#include<bits/stdc++.h>

#define INF 1000010000
#define nl '\n'
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define fi first
#define se second
#define pii pair<int,int>
#define pdd pair<double,double>
#define all(c) (c).begin(), (c).end()
#define SORT(c) sort(all(c))
#define sz(c) (c).size()
#define rep(i,n) for( int i = 0; i < n; ++i )
#define repi(i,n) for( int i = 1 ; i <= n; ++i )
#define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
#define repf(j,i,n) for( int j = i ; j < n ; ++j )
#define die(s) {std::cout << s << nl;}
#define dier(s) {std::cout << s; return 0;}
#define dbg(var) {std::cout << #var << "  = " << var << nl;}
#define vi vector<int>
typedef long long ll;

using namespace std;

int cnt[1111][1111][27];

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.precision(0); 

	int n , m;
	cin >> n >> m;
	
	vector<string> v(n);
	for(auto& el : v) cin >> el;
	
	rep(i , n)
	{
		rep(j , m)
		{
			++cnt[i][j][v[i][j] - 'a'];
			rep(k , 26)
			{
				if(i > 0) cnt[i][j][k] += cnt[i - 1][j][k];
				if(j > 0) cnt[i][j][k] += cnt[i][j - 1][k];
				if(i > 0 && j > 0) cnt[i][j][k] -= cnt[i - 1][j - 1][k];
			}
		}
	}
	
	auto get = [&](int x1 , int y1 , int x2 , int y2 , int k)
	{
		int res = cnt[x1][y1][k];
		if(y2 > 0) res -= cnt[x1][y2 - 1][k];
		if(x2 > 0) res -= cnt[x2 - 1][y1][k];
		if(x2 > 0 && y2 > 0) res += cnt[x2 - 1][y2 - 1][k];
		return res;
	};
	
	ll ans = 0;
	rep(i , n)
	{
		rep(j , m)
		{
			int lh = 1 , rh = n - i - 1;
			while(rh - lh > 1)
			{
				int mid = (rh + lh) / 2;
				if(get(i + mid - 1, j , i , j , v[i][j] - 'a') != mid)
				{
					rh = mid;
				}
				else
				{
					lh = mid;
				}
			}
			
			if(get(i + lh - 1, j , i , j , v[i][j] - 'a') != lh) continue;
			
			const int h = lh;
			if(i + 3 * h - 1 < n)
			{
				char c1 = v[i][j];
				char c2 = v[i + h][j];
				char c3 = v[i + 2 * h][j];
				
				if(c1 == c2 || c2 == c3) break;
				
				bool good = true;
				if(get(i + h - 1, j , i , j , c1 - 'a') != h) good = false;
				if(get(i + 2 * h - 1 , j , i + h , j , c2 - 'a') != h) good = false;
				if(get(i + 3 * h - 1 , j , i + 2 * h , j , c3 - 'a') != h) good = false;
				
				
				if(good)
				{
					int l = j , r = m;
					while(r - l > 1)
					{
						int mid = (r + l) / 2;
						if(
							get(i + h - 1 , mid , i , j , c1 - 'a') != h * (mid - j + 1) ||
							get(i + 2 * h - 1 , mid , i + h , j , c2 - 'a') != h * (mid - j + 1) ||
							get(i + 3 * h - 1 , mid , i + 2 * h , j , c3 - 'a') != h * (mid - j + 1)
						  )
						{
							r = mid;  	
						}
						else
						{
							l = mid;
						}
					}
					
					ans += l - j + 1;
				}
			}
		}
	}
	
	cout << ans << endl;

	return 0;
}