【链接】 我是链接,点我呀:)

【题意】

题意

【题解】

先把所给的压缩形式的字符串转成二进制
然后对获得的01数组做一个前缀和(a[i][j]=以(i,j)为右下角,(1,1)为左上角的矩形内的数字的和)
这样就能O(1)复杂度获得一个长度为x的正方形的区间和了。
这样。我们直接暴力从1..n枚举n的因子x
显然每个因子x要进行(n/x)^2次判断。
有个性质
∑(n/x)^2=n^2*∑(1/(x^2))=n^2*(π^2/6)
所以实际上时间复杂度约等于O(n^2)

【代码】

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N = 5200; int n;
int a[N+10][N+10];
char s[N+10][N+10]; int main(){
/*
4
3
3
3
3
*/
scanf("%d",&n);
for (int i = 1;i <= n;i++){
scanf("%s",s[i]);
for (int j = 0;j < n/4;j++){
int key = s[i][j]-'0';
if (s[i][j]>='A' && s[i][j]<='F'){
key = s[i][j]-'A'+10;
} for (int k = 0;k < 4;k++){
a[i][j*4+4-k] = key%2;
key/=2;
}
}
} for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
a[i][j] = a[i-1][j]+a[i][j-1]-a[i-1][j-1]+a[i][j]; int ans = -1;
for (int x = 1;x <= n;x++)
if (n%x==0){
bool flag = true;
for (int i = x;i <= n;i+=x){
for (int j = x;j <= n;j+=x){
int x0 = i-x+1,y0 = j-x+1;
int x1 = i,y1 = j;
int num = a[x1][y1]-a[x0-1][y1]-a[x1][y0-1]+a[x0-1][y0-1];
if (num!=0 && num!=x*x){
flag = false;
break;
}
}
if (!flag) break;
}
if (flag){
ans = x;
}
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. Tcl internal variables
  2. Unix及类Unix系统文本编辑器的介绍
  3. Comparable和Comparator的区别
  4. jsp+servlet
  5. js分辨浏览器类别和版本
  6. java event
  7. Windows &amp;&amp; Linux 双系统
  8. 什么是bower
  9. 读数据库表填充DataTable
  10. HttpClient(4.3.5) - HTTP Authentication
  11. div随另一个div自动增高
  12. KMP 知识点总结
  13. Swing 显示良好JPanel保存为图片
  14. spring注解关键字
  15. java注解小随笔
  16. Android输出日志到电脑磁盘
  17. 使用NHibernate(6)-- HQL &amp;&amp; ICriteria 简单介绍
  18. MySQL☞视图
  19. ubuntu版的sublime-text3输入中文问题
  20. Android 控件在布局中按比例放置[转]

热门文章

  1. JAVA学习笔记(一)配置环境
  2. UVa 1220 Party at Hali-Bula 晚会
  3. Lucas+中国剩余定理 HDOJ 5446 Unknown Treasure
  4. 转 OGG Troubleshooting-Database error 1 (ORA-00001: unique constraint ...)
  5. solrJ的查询-&gt;统计【转】
  6. Asp.net 字符(一)
  7. javascript回调函数那些事~
  8. leetcode410 Split Array Largest Sum
  9. 【学习笔记】Base64编码解码原理及手动实现(C#)
  10. Android开发实现高德地图定位