Guest User

Untitled

a guest
Apr 10th, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.99 KB | None | 0 0
  1. /*
  2.     JAI JAGANNATH!
  3. */
  4. //@Author : zanj0
  5. #include<bits/stdc++.h>
  6. #include <ext/pb_ds/assoc_container.hpp>
  7. using namespace __gnu_pbds;
  8. using namespace std;
  9. typedef long long int lli;
  10. #define ff              first
  11. #define ss              second
  12. #define pb              push_back
  13. #define mp              make_pair
  14. #define pii             pair<lli,lli>
  15. #define vi              vector<lli>
  16. #define mii             map<lli,lli>
  17. #define pqb             priority_queue<lli>
  18. #define pqs             priority_queue<lli,vi,greater<lli> >
  19. #define setbits(x)      __builtin_popcountll(x)
  20. #define zrobits(x)      __builtin_ctzll(x)
  21. #define mod             1000000007
  22. #define inf             1e18
  23. #define ps(x,y)         fixed<<setprecision(y)<<x
  24. #define mk(arr,n,type)  type *arr=new type[n];
  25. #define w(x)            lli x; cin>>x; while(x--)
  26. mt19937                 rng(chrono::steady_clock::now().time_since_epoch().count());
  27. #define ONLINE_JUDGE
  28. typedef tree<lli, null_type, less<lli>, rb_tree_tag, tree_order_statistics_node_update> pbds;
  29.  
  30.  
  31. void zanj0()
  32. {
  33.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  34. #ifndef ONLINE_JUDGE
  35.     freopen("input.txt", "r", stdin);
  36.     freopen("output.txt", "w", stdout);
  37. #endif
  38. }
  39. void out(vector < vector <lli> >& v) {
  40.     for (lli i = 0; i < v.size(); i++) {
  41.         for (lli j = 0; j < v[i].size(); j++) {
  42.             cout << v[i][j] << " ";
  43.         }
  44.         cout << endl;
  45.     }
  46.     cout << endl;
  47. }
  48. void solve() {
  49.     lli n, k;
  50.     cin >> n >> k;
  51.     vector < vector <lli> > v(n + 20, vector <lli>(n + 20));
  52.  
  53.     for (lli i = 1; i <= n; i++) {
  54.         string s;
  55.         cin >> s;
  56.         for (lli j = 1; j <= n; j++) {
  57.             v[i][j] = s[j - 1] == 'B' ? 0 : 1;
  58.         }
  59.     }
  60.     //out(v);
  61.     vector < vector <lli> > prefixTop(v.begin(), v.end());
  62.     for (lli i = 1; i < v.size(); i++) {
  63.         for (lli j = 0; j < v[i].size(); j++) {
  64.             prefixTop[i][j] += prefixTop[i - 1][j];
  65.         }
  66.     }
  67.     vector < vector <lli> > prefixLeft(v.begin(), v.end());
  68.     for (lli i = 0; i < v.size(); i++) {
  69.         for (lli j = 1; j < v[i].size(); j++) {
  70.             prefixLeft[i][j] += prefixLeft[i][j - 1];
  71.         }
  72.     }
  73.     //out(prefixTop);
  74.     //out(prefixLeft);
  75.     vector < vector <lli> > suffixBottom(v.begin(), v.end());
  76.     vector < vector <lli> > suffixRight(v.begin(), v.end());
  77.     for (lli i = v.size() - 2; i >= 0; i--) {
  78.         for (lli j = 0; j < v[i].size(); j++) {
  79.             suffixBottom[i][j] += suffixBottom[i + 1][j];
  80.         }
  81.     }
  82.     for (lli i = v.size() - 1; i >= 0; i--) {
  83.         for (lli j = v[i].size() - 2; j >= 0; j--) {
  84.             suffixRight[i][j] += suffixRight[i][j + 1];
  85.         }
  86.     }
  87.     //out(suffixBottom);
  88.     //out(suffixRight);
  89.     vector < vector <lli> > validCol(n + 20, vector <lli>(n + 20));
  90.     vector < vector <lli> > validRow(n + 20, vector <lli>(n + 20));
  91.     for (lli i = 1; i + k - 1 <= n; i++) {
  92.         for (lli j = n;  j >= 0; j--) {
  93.             lli oneAtTop = prefixTop[i - 1][j];
  94.             lli oneAtBottom = suffixBottom[i + k][j];
  95.             lli total = n;
  96.  
  97.             validCol[i][j] = ((oneAtBottom + oneAtTop + k) == total) + validCol[i][j + 1];
  98.         }
  99.     }
  100.     //cout << "Okay!"  << endl;
  101.     //out(validCol);
  102.     for (lli i = v.size() - 2; i >= 0; i--) {
  103.         for (lli j = 1; j + k - 1 <= n; j++) {
  104.  
  105.             lli oneAtLeft = prefixLeft[i][j - 1];
  106.             lli oneAtRight = suffixRight[i][j + k];
  107.             //cout << i << " " << j << " " << oneAtLeft << " " << oneAtRight << " " << k << endl;
  108.             validRow[i][j] = ((oneAtRight + oneAtLeft + k) == n) + validRow[i + 1][j];
  109.         }
  110.     }
  111.  
  112.     //out(validRow);
  113.     lli ret = 0;
  114.     lli x = -1, y = -1;
  115.     for (lli i = 1; i + k - 1 <= n; i++) {
  116.         for (lli j = 1 ; j + k - 1 <= n; j++) {
  117.             lli temp = validCol[i][j] - validCol[i][j + k];
  118.             lli rows = validRow[i][j] - validRow[i + k][j];
  119.             //cout << i << " " << j << " " << temp << " " << rows << endl;
  120.             lli z = temp + rows;
  121.             if (z > ret) {
  122.                 ret = z;
  123.                 x = i;
  124.                 y = j;
  125.             }
  126.         }
  127.     }
  128.     for (lli i = 1; i <= n; i++) {
  129.         lli temp = 0;
  130.         for (lli j = 1; j <= n; j++) {
  131.             if (i >= x && i <= x + k - 1 && j >= y && j <= y + k - 1) continue;
  132.             temp += v[i][j];
  133.         }
  134.         ret += temp == n;
  135.     }
  136.     cout << ret << endl;
  137. }
  138. int main()
  139. {
  140.     zanj0();
  141.     solve();
  142.     return 0;
  143. }
Add Comment
Please, Sign In to add comment