Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <random>
- using namespace std;
- typedef unsigned long long ull;
- typedef long long ll;
- typedef long double ld;
- //#define int ll
- //#define int __int128
- //#define ll __int128
- typedef pair<int, int> pii;
- typedef pair<ll, ll> pll;
- typedef vector<int> vi;
- typedef vector< vi > vvi;
- typedef vector< vvi > vvvi;
- typedef vector<bool> vb;
- typedef vector< vb > vvb;
- typedef vector< vvb > vvvb;
- typedef vector<short> vs;
- typedef vector<vs> vvs;
- typedef vector<vvs> vvvs;
- typedef vector<ll> vl;
- typedef vector<vl> vvl;
- typedef vector<vvl> vvvl;
- typedef vector<ld> vld;
- typedef vector<vld> vvld;
- typedef vector<vvld> vvvld;
- typedef vector<string> vst;
- typedef vector<vst> vvst;
- typedef pair<ld, ld> pld;
- typedef complex<double> base;
- #define inmin(a, b) a = min(a, (b))
- #define inmax(a, b) a = max(a, (b))
- #define ALL(a) a.begin(),a.end()
- #define RALL(a) a.rbegin(),a.rend()
- #define sqr(x) ((x) * (x))
- #define fori(i, n) for(int i = 0; i < int(n); ++i)
- #define SZ(a) ((int)((a).size()))
- #define triple(T) tuple<T, T, T>
- #define quad(T) tuple<T, T, T, T>
- #define watch(x) cerr << (#x) << " = " << (x) << endl;
- #ifdef MAX_HOME
- #define cerr cout
- #else
- #define cerr if (false) cerr
- #endif
- const double PI = 2 * acos(0.0);
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- mt19937_64 rng_64(chrono::steady_clock::now().time_since_epoch().count());
- const string DIGITS = "0123456789";
- const string ALPH = "abcdefghijklmnopqrstuvwxyz";
- template <class T0, class T1>
- inline ostream & operator << (ostream &out, pair<T0, T1> &a) {
- return out << "{" << a.first << ", " << a.second << "}";
- }
- template <class T0, class T1, class T2>
- inline ostream & operator << (ostream &out, tuple<T0, T1, T2> &a) {
- return out << "{" << get<0>(a) << ", " << get<1>(a) << ", " << get<2>(a) << "}";
- }
- template <class T0, class T1, class T2, class T3>
- inline ostream & operator << (ostream &out, tuple<T0, T1, T2, T3> &a) {
- return out << "{" << get<0>(a) << ", " << get<1>(a) << ", " << get<2>(a) << ", " << get<3>(a) << "}";
- }
- template<class T>
- inline ostream & operator << (ostream &out, vector<T> &a) {
- out << "[";
- fori (i, a.size())
- out << a[i] << vector<string>{", ", "] "}[i + 1 == a.size()];
- return out;
- }
- void smain();
- signed main() {
- ios::sync_with_stdio(0);
- cin.tie(0); cout.tie(0);
- #ifdef MAX_HOME
- freopen("input.txt", "r", stdin);
- clock_t start = clock();
- #endif
- cout << setprecision(12) << fixed;
- smain();
- #ifdef MAX_HOME
- cout << "\n\n\n\nTOTAL EXECUTION TIME: " << float( clock () - start ) / CLOCKS_PER_SEC << endl;
- #endif
- return 0;
- }
- typedef bitset<2000010> bs;
- int n, m;
- vvi dp;
- bs mat;
- const int L = 22;
- bs cnt[L];
- void smain() {
- cin >> n >> m;
- dp.resize(n + 1, vi(m + 1, 0));
- for (int i = 1; i <= n; ++i) {
- string s;
- cin >> s;
- for (int j = 1; j <= m; ++j) mat[i * (m + 1) + j] = s[j - 1] == '1';
- }
- // cnt.resize(L, vvb(n + 1, vb(m + 1, 0)));
- fori (p, L) {
- cnt[p] = mat;
- for (int i = 1; i <= n; ++i) {
- for (int j = 1; j <= m; ++j) {
- if (i > (1 << p))
- cnt[p][i * (m + 1) + j] = cnt[p][i* (m + 1) +j] ^
- cnt[p][(i - (1 << p))* (m + 1) +j];
- if (j > (1 << p))
- cnt[p][i* (m + 1) +j] = cnt[p][i* (m + 1) +j] ^
- cnt[p][i* (m + 1) +j - (1 << p)];
- if (i > (1 << p) && j > (1 << p))
- cnt[p][i* (m + 1) +j] = cnt[p][i* (m + 1) +j] ^
- cnt[p][(i - (1 << p)) * (m + 1) +j - (1 << p)];
- }
- }
- }
- for (int i = 1; i <= n; ++i) {
- for (int j = 1; j <= m; ++j) {
- int ans = max(dp[i - 1][j], dp[i][j - 1]);
- int res = mat[i* (m + 1) +j];
- if (ans < L) {
- res ^= cnt[ans][i* (m + 1) +j];
- } else {
- res = 0;
- }
- dp[i][j] = ans + res;
- }
- }
- vi a = {1};
- fori (i, dp[n][m]) {
- vi nx;
- int c = 0;
- for (int j = 0; j < a.size(); ++j) {
- c += a[j] * 2;
- nx.push_back(c % 10);
- c /= 10;
- }
- if (c) nx.push_back(c);
- a = nx;
- }
- for (int i = (int)a.size() - 1; i >= 0; --i) {
- cout << a[i];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement