Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.    
  3. #define INF 0x3F3F3F3F
  4. #define DINF 1e+12
  5. #define rep(i, a, b) for (int i = int(a); i < int(b); i++)
  6. #define pb push_back
  7. #define pi 3.1415926535897932384626433832795028841971
  8. #define debug(x) if(1) cout << #x << " = " << x << endl;
  9. #define debug2(x,y) cout << #x << " = " << x << " --- " << #y << " " << y << "\n";
  10. #define all(S) (S).begin(), (S).end()
  11. #define MAXV 1005
  12. #define F first
  13. #define S second
  14. #define EPS 1e-9
  15. #define mp make_pair
  16.    
  17. // freopen("in.txt", "r", stdin);
  18. // freopen("out.txt", "w", stdout);
  19.    
  20. using namespace std;
  21.    
  22. typedef long long ll;
  23. typedef pair < int, int >  ii;
  24.  
  25. char m[1005][1005];
  26. int sum[1005][1005];
  27. int L, C;
  28.  
  29. int S(int x, int y){
  30.     if(x < 0 || y < 0) return 0;
  31.     return sum[x][y];
  32. }
  33.  
  34. int bb(int lo, int hi, int x, int y){
  35.    
  36.     int ma = 0;
  37.     while(lo <= hi){
  38.         int mid = (lo+hi)/2;
  39.         int xx = x+mid-1;
  40.         int yy = y+mid-1;
  41.         int q = sum[xx][yy] - S(xx, y-1) - S(x-1, yy) + S(x-1, y-1);
  42.         if(q == 0){
  43.             lo = mid+1;
  44.             ma = max(ma, mid);
  45.         }
  46.         else
  47.             hi = mid-1;
  48.     }
  49.    
  50.     return ma;
  51. }
  52.  
  53. int main(){
  54.    
  55.     int tc;
  56.     cin >> tc;
  57.    
  58.     while(tc--){
  59.        
  60.         cin >> L >> C;
  61.        
  62.         rep(i, 0, L)
  63.         rep(j, 0, C)
  64.         scanf(" %c",&m[i][j]);
  65.        
  66.         rep(i, 0, L)
  67.         rep(j, 0, C){
  68.             if(!i && !j) sum[i][j] = (m[i][j] == '*');
  69.             else if(!i) sum[i][j] = sum[i][j-1] + (m[i][j] == '*');
  70.             else if(!j) sum[i][j] = sum[i-1][j] + (m[i][j] == '*');
  71.             else sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + (m[i][j] == '*');
  72.         }
  73.        
  74.         int maior = 0;
  75.        
  76.         rep(i, 0, L)
  77.         rep(j, 0, C){
  78.             int hi = min(L-i, C-j);
  79.             int mq = bb(1, hi, i, j);
  80.             if(mq > maior)
  81.                 maior = mq;
  82.         }
  83.        
  84.         vector<ii> v;
  85.        
  86.         rep(i, 0, L)
  87.         rep(j, 0, C){
  88.             int hi = min(L-i, C-j);
  89.             if(hi < maior) continue;
  90.             int xx = i+maior-1;
  91.             int yy = j+maior-1;
  92.             int q = sum[xx][yy] - S(xx, j-1) - S(i-1, yy) + S(i-1, j-1);
  93.             if(q == 0) v.pb(ii(i,j));
  94.         }
  95.        
  96.         sort(all(v));
  97.         int t = v.size();
  98.        
  99.         printf("The side of the square is %d and the locations are:\n", maior);
  100.         rep(i, 0, t)
  101.             printf("%d %d\n", v[i].F+1, v[i].S+1);
  102.         printf("%d in total.\n", t);
  103.        
  104.     }
  105.    
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement