提交时间:2023-01-20 20:39:11
运行 ID: 67910
#include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 1510; bool a[MAXN][MAXN]; int n,pre[MAXN][MAXN]; vector<pair<int,int> > lx[MAXN]; LL ans; int main(){ freopen("shape.in","r",stdin); freopen("shape.out","w",stdout); scanf("%d", &n); for(int i=1;i<=n;i++){ char s[MAXN]; scanf("%s", s); for(int j=0;j<n;j++)a[i][j+1]=s[j]=='0'; } for(int i=1;i<=n;i++){ int l=1; while(!a[i][l])l++; for(int r=l;r<=n+1;r++){ if(!a[i][r]){ for(int j=l;j<r;j++) lx[j].push_back({i,r-1}); while(!a[i][r])r++; l=r; } } } for(int i=1;i<=n;i++){ int l=1; while(!a[l][i]&&l<=n)l++; for(int r=l;r<=n;r++){ if(!a[r][i]||r==n){ if(!a[r][i])r--; int ll=lower_bound(lx[i].begin(),lx[i].end(),make_pair(l,0))-lx[i].begin(); int rl=upper_bound(lx[i].begin(),lx[i].end(),make_pair(r,MAXN))-lx[i].begin()-1; for(int j=ll;j<=rl;j++){ for(int k=j+1;k<=rl;k++){ int len=lx[i][k].first-lx[i][j].first; if(len<2)continue; if(lx[i][k].second-i<len)continue; if(lx[i][j].second-i<len)break; ans+=(lx[i][j].second-len-i+1)*(r-lx[i][k].first); } } if(a[r][i])r++; while(!a[r][i]&&r<=n)r++; l=r; } } } printf("%lld", ans); return 0; } /* 4 0000 0000 0000 0000 6 000010 010000 100000 000001 000001 001001 */