zoukankan      html  css  js  c++  java
  • BZOJ1397 : Ural 1486 Equal squares

    二分答案mid,然后检验是否存在两个相同的mid*mid的正方形

    检验方法:

    首先对于每个位置,求出它开始长度为mid的横行的hash值

    然后对于hash值再求一次竖列的hash值

    将第二次求出的hash值排序,如果存在两个相同的hash值则可行

    #include<cstdio>
    #include<algorithm>
    #define N 510
    typedef unsigned long long ll;
    const ll D1=97,D2=131;
    int n,m,i,j,l,r,mid,ans,t;char a[N][N];ll pow1[N],pow2[N],h[N][N],tmp,tmp2,hash[N*N];
    bool check(int x){
      for(i=1;i<=n;i++){
        for(tmp=0,j=1;j<x;j++)tmp=tmp*D1+a[i][j],h[i][j]=0;
        for(j=x;j<=m;j++)h[i][j]=tmp=tmp*D1-pow1[x]*a[i][j-x]+a[i][j];
      }
      for(t=0,i=x;i<=m;i++){
        for(tmp=0,j=1;j<x;j++)tmp=tmp*D2+h[j][i];
        for(j=x;j<=n;j++)hash[t++]=tmp=tmp*D2-pow2[x]*h[j-x][i]+h[j][i];
      }
      for(std::sort(hash,hash+t),i=1;i<t;i++)if(hash[i-1]==hash[i])return 1;
      return 0;
    }
    int main(){
      scanf("%d%d",&n,&m);
      for(i=1;i<=n;i++)for(scanf("%s",a[i]+1),j=1;j<=m;j++)a[i][j]-='a'-1;
      l=1,r=n<m?n:m;
      for(pow1[0]=pow2[0]=i=1;i<=r;i++)pow1[i]=pow1[i-1]*D1,pow2[i]=pow2[i-1]*D2;
      while(l<=r)if(check(mid=(l+r)>>1))l=(ans=mid)+1;else r=mid-1;
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    HTML DOM Document 对象
    浏览器对象模型 BOM
    JavaScript数组和字符串基础
    JavaScript基础一
    css属性hack
    浏览器兼容性问题
    css常见居中方法
    初析BFC
    学习Css的初级篇
    THML基础学习
  • 原文地址:https://www.cnblogs.com/clrs97/p/4403146.html
Copyright © 2011-2022 走看看