传送门

很蒙蔽,不知道怎么搞。

网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学。

对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二分半径。

但是得考虑边的长度为奇偶所带来的影响。

比如

1 1

1 1

这个边数为偶数的矩阵显然没法搞。

所以得在矩阵中插入0,

变成

0 0 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 0 1 0

0 0 0 0 0

具体操作就看代码好了。

然后只枚举 行 + 列 为偶数的点就行。

注意 用 unsigned long long 会超时和超空间,数据允许用 unsigned int

——代码

 #include <cstdio>
#include <iostream>
#define UI unsigned int const int MAXN = , bs1 = , bs2 = ;
int n, m, ans;
UI sum[][MAXN][MAXN], base1[MAXN], base2[MAXN]; inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline int min(int x, int y)
{
return x < y ? x : y;
} inline bool pd(int x, int y, int l)
{
UI t, h;
h = sum[][x + l - ][y + l - ]
- sum[][x - l][y + l - ] * base1[l + l - ]
- sum[][x + l - ][y - l] * base2[l + l - ]
+ sum[][x - l][y - l] * base1[l + l - ] * base2[l + l - ];
t = sum[][x + l - ][y - l + ]
- sum[][x - l][y - l + ] * base1[l + l - ]
- sum[][x + l - ][y + l] * base2[l + l - ]
+ sum[][x - l][y + l] * base1[l + l - ] * base2[l + l - ];
if(h ^ t) return ;
t = sum[][x - l + ][y + l - ]
- sum[][x + l][y + l - ] * base1[l + l - ]
- sum[][x - l + ][y - l] * base2[l + l - ]
+ sum[][x + l][y - l] * base1[l + l - ] * base2[l + l - ];
if(h ^ t) return ;
t = sum[][x - l + ][y - l + ]
- sum[][x + l][y - l + ] * base1[l + l - ]
- sum[][x - l + ][y + l] * base2[l + l - ]
+ sum[][x + l][y + l] * base1[l + l - ] * base2[l + l - ];
if(h ^ t) return ;
return ;
} inline int work(int i, int j)
{
int mid, s = , x = , y = min(min(i, n - i + ), min(j, m - j + ));//二分半径
while(x <= y)
{
mid = (x + y) >> ;
if(pd(i, j, mid)) s = mid, x = mid + ;
else y = mid - ;
}
return s;
} int main()
{
int i, j, k, x;
n = read();
m = read();
n = n << | ;
m = m << | ;
for(i = ; i <= n; i += )
for(j = ; j <= m; j += )
{
x = read();
for(k = ; k < ; k++) sum[k][i][j] = x;
}
base1[] = base2[] = ;
for(i = ; i <= n; i++) base1[i] = base1[i - ] * bs1;
for(i = ; i <= m; i++) base2[i] = base2[i - ] * bs2;
for(i = ; i <= n; i++)
for(j = ; j <= m; j++)
sum[][i][j] += sum[][i - ][j] * bs1;
for(i = ; i <= n; i++)
for(j = ; j <= m; j++)
sum[][i][j] += sum[][i][j - ] * bs2;
for(i = ; i <= n; i++)
for(j = m; j; j--)
sum[][i][j] += sum[][i - ][j] * bs1;
for(i = ; i <= n; i++)
for(j = m; j; j--)
sum[][i][j] += sum[][i][j + ] * bs2;
for(i = n; i; i--)
for(j = ; j <= m; j++)
sum[][i][j] += sum[][i + ][j] * bs1;
for(i = n; i; i--)
for(j = ; j <= m; j++)
sum[][i][j] += sum[][i][j - ] * bs2;
for(i = n; i; i--)
for(j = m; j; j--)
sum[][i][j] += sum[][i + ][j] * bs1;
for(i = n; i; i--)
for(j = m; j; j--)
sum[][i][j] += sum[][i][j + ] * bs2;
for(i = ; i <= n; i++)
for(j = ; j <= m; j++)
if((i ^ j ^ ) & )
ans += work(i, j) >> ;
printf("%d\n", ans);
return ;
}

Manacher的话,学完再搞吧。

最新文章

  1. MS SQL 排序规则总结
  2. iOS ---不一样的NSLog打印(精准打印)
  3. Swift 2.2发布
  4. vb.net dll创建
  5. Myeclipse其实和Eclipse差不多的, 至少不输出来的项目时一模一样的
  6. 用Appium去操作移动设备上的chrome
  7. HDU4272LianLianKan(dfs)
  8. Autofac介绍
  9. 使用MiniProfiler调试Asp.net Mvc性能
  10. uniq详解
  11. Mysql 技巧
  12. 使用vs2015编写c语言程序
  13. 谈谈当代大学生学习IT技术的必要性。
  14. Keil不能跳转到函数的定义怎么办
  15. MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)
  16. 启动tomcat 报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
  17. 20155323刘威良《网络对抗》Exp8 Web基础
  18. coco2d-x游戏逻辑结构
  19. CSS网页布局中易犯的30个小错误
  20. [Python] Scipy and Numpy(1)

热门文章

  1. 苹果市值破万亿,iPhone 会涨价吗?
  2. 解决TS报错Property &#39;style&#39; does not exist on type &#39;Element&#39;
  3. Java写诗程序
  4. 2019.05.26 周日--《阿里巴巴 Java 开发手册》精华摘要
  5. JavaScript学习整理(转载)
  6. 约束Constraints
  7. 【交互 细节题 思维题】cf1064E. Dwarves, Hats and Extrasensory Abilities
  8. JWT的使用流程
  9. shell 练习题 - 第三周
  10. 【Python高级工程师之路】入门+进阶+实战+爬虫+数据分析整套教程