#include <bits/stdc++.h>
#ifndef DEBUG
#define debug(x)
#endif
using namespace std;
int cnt[800010];
vector<int> vis;//桶记录前缀和为0的子区间
int main() {
cin.tie(0)->sync_with_stdio(0);
int T;cin>>T;
while(T--){
int n,m;cin>>n>>m;
vector<vector<int>> a(n+1,vector<int>(m+1,0));
for(int i=1;i<=n;i++){
string s;cin>>s;
for(int j=1;j<=m;j++){
if(s[j-1]=='#') a[i][j]=1;
else a[i][j]=-1;
}
}
if(n>m){
vector<vector<int>> b(n+1,vector<int>(m+1,0));
b=a;
a.resize(m+1,vector<int>(n+1,0));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)
a[i][j]=b[j][i];
swap(n,m);
}//rotate
vector<vector<int>> sum(n+1,vector<int>(m+1,0));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) sum[i][j]=sum[i-1][j]+a[i][j];
long long ans=0;
for(int u=1;u<=n;u++){
for(int d=u;d<=n;d++){
vis.clear();
int now=0;
cnt[400000]=1;
for(int i=1;i<=m;i++){
now+=(sum[d][i]-sum[u-1][i]);
ans+=cnt[now+400000];
cnt[now+400000]++;
vis.push_back(now+400000);
}
for(auto x:vis) cnt[x]=0;
}
}
cout<<ans<<endl;
}
return 0;
}
有22个点RE
并且,如果去掉旋转那一段代码,就没有RE了,只剩三个TLE,所以我觉得只能是旋转那一段有问题(不排除这一段导致其他地方有问题)