#include <bits/stdc++.h>
typedef long long ll;
typedef long double ld;
void fileio(){
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
}
#define int ll
#define ld long double
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define START_TIMER auto start = std::chrono::high_resolution_clock::now();
#define END_TIMER(msg) \
auto end = std::chrono::high_resolution_clock::now(); \
std::cout << msg << ": " \
<< std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() \
<< " ms" << std::endl;
using namespace std;
const double pi = 3.14159265358979;
int cnt=0;
int H,W;
vector<string> grid;
bool sym(int h1,int h2,int w1,int w2){
int hh=h1+h2,ww=w1+w2;
for (int i = h1; i <=h2; i++)
{
for (int j = w1; j <=w2; j++)
{
//cout<<hh-i<<" "<<ww-j<<endl;
if(grid[i][j]!=grid[hh-i][ww-j]) return false;
}
}
return true;
}
void comp(int h,int w){
for (int i = h; i < H; i++)
{
for (int j = w; j < W; j++)
{
if(sym(h,i,w,j)) cnt++;
}
}
}
void solve()
{
cin>>H>>W;
grid.resize(H);
for (int i = 0; i < H; i++)
{
cin>>grid[i];
}
for (int i = 0; i < H; i++)
{
for (int j = 0; j < W; j++)
{
comp(i,j);
}
}
cout<<cnt;
}
signed main()
{
fileio();
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
ll t=1;//cin>>t;
while(t--)
{solve();}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp2b2lkIGZpbGVpbygpewogICAgI2lmZGVmIExPQ0FMCiAgICAgICAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKICAgICNlbmRpZgp9CiNkZWZpbmUgaW50IGxsCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBhbGwodikgdi5iZWdpbigpLHYuZW5kKCkKI2RlZmluZSByYWxsKHYpIHYucmJlZ2luKCksdi5yZW5kKCkKI2RlZmluZSBTVEFSVF9USU1FUiBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiNkZWZpbmUgRU5EX1RJTUVSKG1zZykgXAogICAgYXV0byBlbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsgXAogICAgc3RkOjpjb3V0IDw8IG1zZyA8PCAiOiAiIFwKICAgICAgICAgICAgICA8PCBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbmQgLSBzdGFydCkuY291bnQoKSBcCiAgICAgICAgICAgICAgPDwgIiBtcyIgPDwgc3RkOjplbmRsOwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgZG91YmxlIHBpID0gMy4xNDE1OTI2NTM1ODk3OTsKCmludCBjbnQ9MDsKaW50IEgsVzsKdmVjdG9yPHN0cmluZz4gZ3JpZDsKCmJvb2wgc3ltKGludCBoMSxpbnQgaDIsaW50IHcxLGludCB3Mil7CiAgICBpbnQgaGg9aDEraDIsd3c9dzErdzI7CiAgICBmb3IgKGludCBpID0gaDE7IGkgPD1oMjsgaSsrKQogICAgewogICAgICAgIGZvciAoaW50IGogPSB3MTsgaiA8PXcyOyBqKyspCiAgICAgICAgewogICAgICAgICAgICAvL2NvdXQ8PGhoLWk8PCIgIjw8d3ctajw8ZW5kbDsKICAgICAgICAgICAgaWYoZ3JpZFtpXVtqXSE9Z3JpZFtoaC1pXVt3dy1qXSkgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwp9Cgp2b2lkIGNvbXAoaW50IGgsaW50IHcpewogICAgZm9yIChpbnQgaSA9IGg7IGkgPCBIOyBpKyspCiAgICB7CiAgICAgICAgZm9yIChpbnQgaiA9IHc7IGogPCBXOyBqKyspCiAgICAgICAgewogICAgICAgICAgICBpZihzeW0oaCxpLHcsaikpIGNudCsrOwogICAgICAgIH0KICAgIH0KICAgIAp9Cgp2b2lkIHNvbHZlKCkKewogICAgY2luPj5IPj5XOwogICAgZ3JpZC5yZXNpemUoSCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IEg7IGkrKykKICAgIHsKICAgICAgICBjaW4+PmdyaWRbaV07CiAgICB9CiAgICAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSDsgaSsrKQogICAgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgVzsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgY29tcChpLGopOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQ8PGNudDsKCn0KCnNpZ25lZCBtYWluKCkKewogICAgZmlsZWlvKCk7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCk7CiAgICBsbCB0PTE7Ly9jaW4+PnQ7CiAgICB3aGlsZSh0LS0pCiAgICB7c29sdmUoKTt9Cn0K