BZOJ1397 : Ural 1486 Equal squares
2015-01-24 21:26
190 查看
二分答案mid,然后检验是否存在两个相同的mid*mid的正方形
检验方法:
首先对于每个位置,求出它开始长度为mid的横行的hash值
然后对于hash值再求一次竖列的hash值
将第二次求出的hash值排序,如果存在两个相同的hash值则可行
检验方法:
首先对于每个位置,求出它开始长度为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 ;ll pow1 ,pow2 ,h ,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; }
相关文章推荐
- URAL 1486 Equal Squares 二维Hash
- BZOJ1397 Ural 1486 Equal squares
- 【URAL 1486】Equal Squares(二维哈希+二分)
- 【URAL 1486】Equal Squares
- URAL 1486 Equal Squares
- URAL 1486 Equal Squares 二维字符串Hash + 邻接表分组
- 【bzoj1486】【[HNOI2009]梦幻布丁】启发式链表合并(详解)
- BZOJ1486: [HNOI2009]最小圈 分数规划
- 【BZOJ 2786】 Ural1142 Relation
- bzoj 1486: [HNOI2009]最小圈
- ural1486_二维hash匹配
- BZOJ 1486: [HNOI2009]最小圈 分数规划
- BZOJ 1486: [HNOI2009]最小圈
- BZOJ 1486 最小圈
- BZOJ 1486 HNOI 2009 最小圈 DFS
- bzoj1486 [HNOI2009]最小圈
- bzoj 1486: [HNOI2009]最小圈
- 【bzoj1486】最小圈 分数规划
- [bzoj1486][HNOI2009]最小圈
- [BZOJ 1486][HNOI2009]最小圈(二分答案+dfs写的spfa判负环)