给定一个矩阵图案,找到有几种图形满足上面不等于中面,中面不等于下面.
处理高度数组 ,宽度数组
即可.对答案贡献就是
.
#include<bits/stdc++.h> #define sc scanf using namespace std; const int N=3e5+5; const int mod=1e9+7; typedef unsigned long long ull; typedef long long ll; template <typename it>int o(it a){cout<<a<<endl;return 0;} int n,m; ll ans=0; int h[1005][1005],w[1005][1005]; char s[1005][1005]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++)sc("%s",s[i]+1); for(int j=1;j<=m;j++) for(int i=n;i>=1;i--) h[i][j]=(s[i][j]==s[i+1][j])?h[i+1][j]+1:1; for(int i=1;i<=n;i++) for(int j=m;j>=1;j--) w[i][j]=(s[i][j]==s[i][j+1])?w[i][j+1]+1:1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;){ int x=i; if(x+h[x][j]<=n){ int y=x+h[x][j]; if(h[y][j]==h[x][j]){ if(y+h[y][j]<=n){ int z=y+h[y][j]; if(h[z][j]>=h[y][j]){ int len=m; for(int k=x;k<z+h[y][j];k++)len=min(len,w[k][j]); ans+=1ll*len*(len+1)/2; j+=len; }else j++; }else j++; }else j++; }else j++; } } o(ans); }