题意:
思路:
设d p [ i ] [ j ]表示以( i , j )为起点,相同颜色的继续向下延伸,最大的扩展距离。
O ( n 2 )枚举每个点作为右上角的答案,判断同一列的i + d , i + 2 d的颜色和d p是否符合条件,判断i + 3 d是否越界。对于上一列,如果能够连接这列的话也要增加答案。
代码:
char s[1100][1100]; int dp[1100][1100]; int main(){ int n=read,m=read; rep(i,1,n) scanf("%s",s[i]+1); for(int i=n;i;i--) for(int j=1;j<=m;j++){ if(s[i][j]==s[i+1][j]) dp[i][j]=dp[i+1][j]+1; else dp[i][j]=1; } /* rep(i,1,n) rep(j,1,m){ cout<<dp[i][j]<<" "; if(j==m) puts(""); }*/ int ans=0; for(int i=1;i<=n;i++){ int tmp=0; for(int j=1;j<=m;j++){ int d=dp[i][j]; if(i+3*d-1<=n&&dp[i+d][j]==d&&dp[i+2*d][j]>=d&&s[i][j]!=s[i+d][j]&&s[i+d][j]!=s[i+2*d][j]){ if(dp[i][j-1]==d&&dp[i+d][j-1]==d&&dp[2*d+i][j]>=d&&s[i][j]==s[i][j-1]&&s[i+d][j]==s[i+d][j-1]&&s[i+2*d][j]==s[i+2*d][j-1]){ tmp++; } else tmp=1; } else tmp=0; ans+=tmp; } } printf("%d",ans); return 0; } /* 4 3 aaa bbb ccb ddd */