1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include<bits/stdc++.h> #define inf 0x3f3f3f3f3f3f3f3fll #define debug(x) cerr<<#x<<"="<<x<<endl using namespace std; using ll=long long; using ld=long double; using pli=pair<ll,int>; using pi=pair<int,int>; template<typename A> using vc=vector<A>; inline int read() { int s=0,w=1;char ch; while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1; while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int pre[2505][2505]; char s[2505][2505]; char t[2505][2505]; char *ss[2505]; char *tt[2505]; int w1[11]; int w2[11]; int n,m,k; inline int get(int u,int d,int l,int r) { return pre[d][r]-pre[u-1][r]-pre[d][l-1]+pre[u-1][l-1]; } inline ll run(char **s,char **t,int u,int d,int l,int r) { if(r-l+1>d-u+1) return run(t,s,l,r,u,d); if(u==d) { if(s[u][l]=='0'&&k==0) return 1; if(s[u][l]=='1'&&k==1) return 1; return 0; } ll ans=0;int mid=(u+d)>>1; for(int i=u;i<=d;i++) for(int j=l;j<=r;j++) { pre[i][j]=s[i][j]-'0'; pre[i][j]+=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]; }
for(int i=l;i<=r;i++) { for(int j=0;j<=k;j++) w1[j]=u,w2[j]=d; for(int j=i;j<=r;j++) { for(int p=0;p<=k;p++) { while(get(w1[p],mid,i,j)>p) w1[p]++; while(get(mid+1,w2[p],i,j)>p) w2[p]--; } for(int p=0;p<=k;p++) { int tu=(p?w1[p-1]:mid+1)-w1[p]; int td=w2[k-p]-(p!=k?w2[k-p-1]:mid); ans+=tu*td; } } }
for(int i=u;i<=d;i++) for(int j=l;j<=r;j++) pre[i][j]=0;
ans+=run(s,t,u,mid,l,r); ans+=run(s,t,mid+1,d,l,r); return ans; } int main() { n=read(),m=read(),k=read(); for(int i=1;i<=n;i++) scanf("%s",s[i]+1); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) t[i][j]=s[j][i]; for(int i=1;i<=n;i++) ss[i]=s[i]; for(int i=1;i<=m;i++) tt[i]=t[i]; printf("%lld\n",run(ss,tt,1,n,1,m)); return 0; }
|