Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define INF 0x3F3F3F3F
- #define DINF 1e+12
- #define rep(i, a, b) for (int i = int(a); i < int(b); i++)
- #define pb push_back
- #define pi 3.1415926535897932384626433832795028841971
- #define debug(x) if(1) cout << #x << " = " << x << endl;
- #define debug2(x,y) cout << #x << " = " << x << " --- " << #y << " " << y << "\n";
- #define all(S) (S).begin(), (S).end()
- #define MAXV 1005
- #define F first
- #define S second
- #define EPS 1e-9
- #define mp make_pair
- // freopen("in.txt", "r", stdin);
- // freopen("out.txt", "w", stdout);
- using namespace std;
- typedef long long ll;
- typedef pair < int, int > ii;
- char m[1005][1005];
- int sum[1005][1005];
- int L, C;
- int S(int x, int y){
- if(x < 0 || y < 0) return 0;
- return sum[x][y];
- }
- int bb(int lo, int hi, int x, int y){
- int ma = 0;
- while(lo <= hi){
- int mid = (lo+hi)/2;
- int xx = x+mid-1;
- int yy = y+mid-1;
- int q = sum[xx][yy] - S(xx, y-1) - S(x-1, yy) + S(x-1, y-1);
- if(q == 0){
- lo = mid+1;
- ma = max(ma, mid);
- }
- else
- hi = mid-1;
- }
- return ma;
- }
- int main(){
- int tc;
- cin >> tc;
- while(tc--){
- cin >> L >> C;
- rep(i, 0, L)
- rep(j, 0, C)
- scanf(" %c",&m[i][j]);
- rep(i, 0, L)
- rep(j, 0, C){
- if(!i && !j) sum[i][j] = (m[i][j] == '*');
- else if(!i) sum[i][j] = sum[i][j-1] + (m[i][j] == '*');
- else if(!j) sum[i][j] = sum[i-1][j] + (m[i][j] == '*');
- else sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + (m[i][j] == '*');
- }
- int maior = 0;
- rep(i, 0, L)
- rep(j, 0, C){
- int hi = min(L-i, C-j);
- int mq = bb(1, hi, i, j);
- if(mq > maior)
- maior = mq;
- }
- vector<ii> v;
- rep(i, 0, L)
- rep(j, 0, C){
- int hi = min(L-i, C-j);
- if(hi < maior) continue;
- int xx = i+maior-1;
- int yy = j+maior-1;
- int q = sum[xx][yy] - S(xx, j-1) - S(i-1, yy) + S(i-1, j-1);
- if(q == 0) v.pb(ii(i,j));
- }
- sort(all(v));
- int t = v.size();
- printf("The side of the square is %d and the locations are:\n", maior);
- rep(i, 0, t)
- printf("%d %d\n", v[i].F+1, v[i].S+1);
- printf("%d in total.\n", t);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement