HDU 4618 Palindrome Sub-Array 二分(奇偶)+hash判断是否对称
2013-08-09 17:16
483 查看
转自:http://blog.csdn.net/tri_integral/article/details/9472437
有一个全由数字组成的矩阵,你要找到一个最大的子正方形,且这个正方形每一行每一列都是回文串。 二分(奇偶)+hash判断是否对称
有一个全由数字组成的矩阵,你要找到一个最大的子正方形,且这个正方形每一行每一列都是回文串。 二分(奇偶)+hash判断是否对称
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m; long long hash_r[2][310][310]; long long hash_c[2][310][310]; long long p[310]; int a[310][310]; void hash(){ int i,j; for(i=1;i<=n;i++){ for(j=1;j<=m;j++) hash_r[0][i][j]=hash_r[0][i][j-1]*131+a[i][j]; for(j=m;j>=1;j--) hash_r[1][i][j]=hash_r[1][i][j+1]*131+a[i][j]; } for(i=1;i<=m;i++){ for(j=1;j<=n;j++) hash_c[0][j][i]=hash_c[0][j-1][i]*131+a[j][i]; for(j=n;j>=1;j--) hash_c[1][j][i]=hash_c[1][j+1][i]*131+a[j][i]; } } long long cal_r0(int r,int x,int y){return hash_r[0][r][y]-hash_r[0][r][x-1]*p[y-x+1];} long long cal_r1(int r,int x,int y){return hash_r[1][r][x]-hash_r[1][r][y+1]*p[y-x+1];} long long cal_c0(int c,int x,int y){return hash_c[0][y][c]-hash_c[0][x-1][c]*p[y-x+1];} long long cal_c1(int c,int x,int y){return hash_c[1][x][c]-hash_c[1][y+1][c]*p[y-x+1];} int check(int l){ int i,j,k; for(i=1;i+l-1<=n;i++){ for(j=1;j+l-1<=m;j++){ int flag=1; for(k=i;k<=i+l-1&&flag;k++) if(cal_r0(k,j,j+l/2-1)!=cal_r1(k,j+l/2+l%2,j+l-1))flag=0; for(k=j;k<=j+l-1&&flag;k++) if(cal_c0(k,i,i+l/2-1)!=cal_c1(k,i+l/2+l%2,i+l-1))flag=0; if(flag)return 1; } } return 0; } int main(){ int T,i,j; scanf("%d",&T); p[0]=1; for(i=1;i<310;i++) p[i]=p[i-1]*131; while(T--){ scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); hash(); int l=0,r=n/2,ans=1; while (l<=r){ int mid=(l+r)>>1; if (check(2*mid+1)){ ans=2*mid+1;l=mid+1; } else r=mid-1; } l=(ans+1)/2,r=n/2; while (l<=r){ int mid=(l+r)>>1; if (check(2*mid)){ ans=2*mid;l=mid+1; } else r=mid-1; } printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU 4618 Palindrome Sub-Array(Manacher、二分)
- HDU-4618-Palindrome Sub-Array
- HDU 4618 Palindrome Sub-Array(最大回文子矩阵)
- HDU 4618 Palindrome Sub-Array(DP)
- hdu 4618 Palindrome Sub-Array
- HDU 4618 Palindrome Sub-Array (HASH + 枚举)
- hdu 4618——Palindrome Sub-Array
- hdu 4618 Palindrome Sub-Array
- hdu 4618 Palindrome Sub-Array(dp)
- HDU 4618 - Palindrome Sub-Array(2013MUTC2-1008)(DP)
- Hdu 4618 Palindrome Sub-Array
- hdu 3902 Swordsman 判断多边形是否轴对称以及对称轴个数
- HDU 4618Palindrome Sub-Array(暴力枚举每一个正方形)
- HDU 1407 测试你是否和LTC水平一样高 枚举、二分、hash
- 2013 多校第二场 hdu 4618 Palindrome Sub-Array
- HDU - 4618 H - Palindrome Sub-Array
- HDU 1407 测试你是否和LTC水平一样高 枚举、二分、hash
- HDU 4618 Palindrome Sub-Array (2013多校2 1008 暴力)
- hdu 4618 Palindrome Sub-Array
- HDU 4618 - Palindrome Sub-Array(2013MUTC2-1008)(DP)