fork download
  1. //#pragma GCC optimize("O3")
  2. //#pragma GCC optimize("Ofast")
  3. //#pragma GCC optimize("unroll-loops")
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. #define ll long long
  7. #define db double
  8. #define is insert
  9. #define pb push_back
  10. #define pii pair<int, int>
  11. #define pll pair<long long, long long>
  12. #define X first
  13. #define Y second
  14. #define vi vector<int>
  15. #define vpi vector<pair<int, int>>
  16. #define msi multiset<int>
  17. #define int long long
  18. const int m97 = (int)1e9+7;
  19. const int m83 = 998244353;
  20. const int N = 1005;
  21. const int K = 30;
  22. const int inf = (int)1e18;
  23.  
  24. //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  25.  
  26. int n, m;
  27. int a[N][N];
  28. int h[N], l[N], r[N];
  29.  
  30. void solve(){
  31. cin >> n >> m;
  32. for(int i=1; i<=n; i++){
  33. for(int j=1; j<=m; j++){
  34. cin >> a[i][j];
  35. }
  36. }
  37. if(n <= 20){
  38. int mx = 0;
  39. for(int i1=1; i1<=n; i1++){
  40. for(int j1=1; j1<=m; j1++){
  41. for(int i2 = 1; i2 <= i1; i2++){
  42. for(int j2 = 1; j2 <= j1; j2++){
  43. bool ok = 1;
  44. int tar = a[i1][j1];
  45. for(int curi = i2; curi <= i1; curi++){
  46. for(int curj = j2; curj <= j1; curj++){
  47. ok &= (a[curi][curj] == tar);
  48. }
  49. }
  50. if(ok){
  51. mx = max((i1 - i2 + 1 + j1 - j2 + 1) * 2, mx);
  52. }
  53. }
  54. }
  55. }
  56. }
  57. cout << mx << "\n";
  58. }
  59. else{
  60. int mx = 0;
  61. for(int cur = 0; cur <= 9; cur++){
  62. fill(h + 1, h + m + 1, 0);
  63. fill(l + 1, l + m + 1, 1);
  64. fill(r + 1, r + m + 1, m + 1);
  65. for(int i=1; i <=n; i++){
  66. for(int j=1; j<=m; j++){
  67. h[j] = (a[i][j] == cur ? h[j] + 1 : 0);
  68. }
  69. int cl = 1;
  70. for(int j=1; j<=m; j++){
  71. if(a[i][j] == cur){
  72. l[j] = max(l[j], cl);
  73. }
  74. else{
  75. l[j] = 1;
  76. cl = j + 1;
  77. }
  78. }
  79. int cr = m + 1;
  80. for(int j=m; j>=1; j--){
  81. if(a[i][j] == cur){
  82. r[j] = min(r[j], cr);
  83. }
  84. else{
  85. r[j] = m + 1;
  86. cr = j;
  87. }
  88. }
  89. for(int j=1; j <= m; j++){
  90. int ch = h[j];
  91. int cw = r[j] - l[j];
  92. if(ch > 0 && cw > 0){
  93. mx = max(mx, (ch + cw) * 2);
  94. }
  95. }
  96. }
  97. }
  98. cout << mx;
  99. }
  100. }
  101.  
  102. signed main(){
  103. freopen("FLATLAND.INP", "r", stdin);
  104. freopen("FLATLAND.OUT", "w", stdout);
  105. ios::sync_with_stdio(0);
  106. cin.tie(0); cout.tie(0);
  107. int tt = 1; //cin >> tt;
  108. while(tt--){
  109. solve();
  110. }
  111. }
  112.  
  113. /*
  114. sample
  115.  
  116.  
  117.  
  118. */
  119.  
Success #stdin #stdout 0.01s 5328KB
stdin
Standard input is empty
stdout
Standard output is empty