>Link
ybtoj子正方形
>解题思路
其实跟这道题差不多,甚至更简单,因为不用考虑镜面翻转
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100
#define ull unsigned long long
using namespace std;
const ull p1 = 100003, p2 = 100009;
int n, ans;
ull a[N][N], b[N][N], ha[N][N], hb[N][N], l1[N], l2[N];
ull aska (int x, int y, int xx, int yy)
{
return
ha[xx][yy] - ha[x - 1][yy] * l2[xx - x + 1]
- ha[xx][y - 1] * l1[yy - y + 1]
+ ha[x - 1][y - 1] * l1[yy - y + 1] * l2[xx - x + 1];
}
ull askb (int x, int y, int xx, int yy)
{
return
hb[xx][yy] - hb[x - 1][yy] * l2[xx - x + 1]
- hb[xx][y - 1] * l1[yy - y + 1]
+ hb[x - 1][y - 1] * l1[yy - y + 1] * l2[xx - x + 1];
}
void work (int x1, int y1, int x2, int y2)
{
int l = 0, r = n, mid;
while (l <= r)
{
mid = (l + r) / 2;
int x, y, xx, yy;
x = x1 - mid, y = y1 - mid;
xx = x1 + mid, yy = y1 + mid;
if (x < 1 || y < 1 || xx > n || yy > n)
{r = mid - 1; continue;}
ull r1 = aska (x, y, xx, yy);
x = x2 - mid, y = y2 - mid;
xx = x2 + mid, yy = y2 + mid;
if (x < 1 || y < 1 || xx > n || yy > n)
{r = mid - 1; continue;}
ull r2 = askb (x, y, xx, yy);
if (r1 == r2)
l = mid + 1, ans = max (ans, 2 * mid + 1);
else r = mid - 1;
}
l = 0, r = n;
while (l <= r)
{
mid = (l + r) / 2;
int x, y, xx, yy;
x = x1 - mid + 1, y = y1 - mid + 1;
xx = x1 + mid, yy = y1 + mid;
if (x < 1 || y < 1 || xx > n || yy > n)
{r = mid - 1; continue;}
ull r1 = aska (x, y, xx, yy);
x = x2 - mid + 1, y = y2 - mid + 1;
xx = x2 + mid, yy = y2 + mid;
if (x < 1 || y < 1 || xx > n || yy > n)
{r = mid - 1; continue;}
ull r2 = askb (x, y, xx, yy);
if (r1 == r2)
l = mid + 1, ans = max (ans, 2 * mid);
else r = mid - 1;
}
}
int main()
{
scanf ("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) scanf ("%lld", &a[i][j]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) scanf ("%lld", &b[i][j]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
ha[i][j] = ha[i][j - 1] * p1 + a[i][j];
hb[i][j] = hb[i][j - 1] * p1 + b[i][j];
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
ha[i][j] += ha[i - 1][j] * p2;
hb[i][j] += hb[i - 1][j] * p2;
}
l1[0] = l2[0] = 1;
for (int i = 1; i <= n; i++)
l1[i] = l1[i - 1] * p1, l2[i] = l2[i - 1] * p2;
for (int x1 = 1; x1 <= n; x1++)
for (int y1 = 1; y1 <= n; y1++)
for (int x2 = 1; x2 <= n; x2++)
for (int y2 = 1; y2 <= n; y2++)
work (x1, y1, x2, y2);
printf ("%d", ans);
return 0;
}