要加强数据请自己提供 hack 数据。
by yurzhang @ 2021-08-04 16:59:54
```cpp
#include<iostream>
using namespace std;
const int N = 1003;
int n, m, square[N][N];
class Pos
{
public:
int x, y;
Pos() {}
Pos(int a, int b) :x(a), y(b) {}
friend Pos operator+(Pos a, Pos b)
{
return Pos(a.x + b.x, a.y + b.y);
}
friend Pos operator-(Pos a, Pos b)
{
return Pos(a.x - b.x, a.y - b.y);
}
friend Pos operator*(Pos a, int b)
{
return Pos(a.x * b, a.y * b);
}
friend Pos operator/(Pos a, int b)
{
return Pos(a.x / b, a.y / b);
}
friend istream& operator>>(istream& in, Pos& a)
{
in >> a.x >> a.y;
return in;
}
};
bool leg(Pos a, int sz)
{
if (sz & 1)
{
sz >>= 1;
if (a.x + sz >= n || a.x - sz < 0)
return 0;
if (a.y + sz >= m || a.y - sz < 0)
return 0;
return 1;
}
else
{
sz >>= 1;
if (a.x + sz >= n || a.x - sz < -1)
return 0;
if (a.y + sz >= m || a.y - sz < -1)
return 0;
return 1;
}
}
int count(Pos a)
{
bool flag = 1;
int ans = 0;
for (int i = 2; flag; i += 2)
{//当前正方形不可扩展后或者越界break,最坏枚举n次
if (!leg(a, i))
break;
for (int j = 0; j < (i >> 1); ++j)
{//暴力扩展正方形边界,最坏枚举n次
Pos af = a + Pos{ -(i >> 1) + 1, -j }, aj = a + Pos{ i >> 1,-j },
ak = a + Pos{ -(i >> 1) + 1,j + 1 }, al = a + Pos{ i >> 1,j + 1 };
bool f = square[af.x][af.y] == square[aj.x][aj.y] &&
square[aj.x][aj.y] == square[ak.x][ak.y] && square[ak.x][ak.y] == square[al.x][al.y];
if (!f)
{
flag = 0;
break;
}
af = a + Pos{ -j , -(i >> 1) + 1 }, aj = a + Pos{ -j ,i >> 1 },
ak = a + Pos{ j + 1 , -(i >> 1) + 1 }, al = a + Pos{ j + 1, i >> 1 };
f = square[af.x][af.y] == square[aj.x][aj.y] &&
square[aj.x][aj.y] == square[ak.x][ak.y] && square[ak.x][ak.y] == square[al.x][al.y];
if (!f)
{
flag = 0;
break;
}
}
if (flag)
++ans;
}
flag = 1;
for (int i = 3; flag; i += 2)
{
if (!leg(a, i))
break;
for (int j = 0; j <= (i >> 1); ++j)
{
Pos af = a + Pos{ -(i >> 1), -j }, aj = a + Pos{ i >> 1,-j },
ak = a + Pos{ -(i >> 1),j }, al = a + Pos{ i >> 1,j };
bool f = square[af.x][af.y] == square[aj.x][aj.y] &&
square[aj.x][aj.y] == square[ak.x][ak.y] && square[ak.x][ak.y] == square[al.x][al.y];
if (!f)
{
flag = 0;
break;
}
af = a + Pos{ -j , -(i >> 1) }, aj = a + Pos{ -j ,i >> 1 },
ak = a + Pos{ j , -(i >> 1) }, al = a + Pos{ j, i >> 1 };
f = square[af.x][af.y] == square[aj.x][aj.y] &&
square[aj.x][aj.y] == square[ak.x][ak.y] && square[ak.x][ak.y] == square[al.x][al.y];
if (!f)
{
flag = 0;
break;
}
}
if (flag)
++ans;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
cin >> square[i][j];
}
}
int ans = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{//两层循环平方
ans += count(Pos{ i,j });//count复杂度最坏情况平方
}
}
cout << ans + n * m;
}
```
如注释
by donkeys @ 2021-08-04 17:12:05
只需要
```
1000 1000
1 1 repeat 998times
1 1 repeat 998times
repeat 998times
```
就能卡掉
by donkeys @ 2021-08-04 17:14:20
@[donkeys](/user/237893) 您的 hack 数据已添加进本题,感谢您的贡献~
by yurzhang @ 2021-08-04 17:56:29
请求管理撤下[这篇题解](https://cloudy-sky.blog.luogu.org/solution-2601)@[yurzhang](/user/126486)
by _CloudySky_ @ 2021-08-05 10:28:03
刚发就被 Hack 了…
by _CloudySky_ @ 2021-08-05 10:29:02
@[_CloudySky_](/user/304572) 已经撤下。
其实昨天我就测了您的题解,而且您的题解好像还是我打回去好几遍之后通过的(
by yurzhang @ 2021-08-05 11:17:41
感谢管理员
话说打回理由好像并没有说我的复杂度不对:(
而且题解还是审严格一点号好
@[yurzhang](/user/126486)
by _CloudySky_ @ 2021-08-05 11:35:56
@[_CloudySky_](/user/304572) 因为我们鼓励不同解法的题解,所以某些复杂度可能没有那么正确,但足够新颖有趣的题解也是可以通过的。
by yurzhang @ 2021-08-05 11:39:57