WA on #1 #3 #4 #11
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll N = 1e5 + 10, mod = 1e5 + 7;
ll n, m, head[N], cnt, ans, a[N][40];
struct Edge { ll nxt, to; } e[N << 1];
void add(ll u, ll v) { e[++ cnt] = {head[u], v}; head[u] = cnt; }
ll rd() {
ll sum = 0; bool f = 0; char ch = getchar();
while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
while (ch >= '0' && ch <= '9') sum = (sum << 1) + (sum << 3) + (ch ^ 48), ch = getchar();
return f ? -sum : sum;
}
bool check(ll x, ll y) {
for (ll i = 1; i < m; ++ i)
if (a[x][i] - a[x][i - 1] != a[y][i] - a[y][i - 1])
return false;
return true;
}
signed main() {
// freopen("P1360_1.in", "r", stdin);
// freopen("P1360_1.out", "w", stdout);
ll n = rd(), m = rd();
for (ll i = 1, x; i <= n; ++ i) {
x = rd();
for (ll j = 0; j < m; ++ j) a[i][j] = a[i - 1][j] + ((x >> j) & 1);
}
add(0, 0);
for (ll i = 1, h = 0; i <= n; ++ i, h = 0) {
bool flag = true;
for (ll j = 1; j < m; ++ j) h = ((h + a[i][j] - a[i][j - 1]) * j % mod + mod) % mod;
for (ll j = head[h], k; j; j = e[j].nxt)
// for (ll j = 0; j < i; ++ j)
if (check(i, j)) {
ans = max(ans, i - j), flag = false;
// if (i - e[j].to == 99502) printf("%lld %lld\n", i, e[j].to);
}
if (flag) add(h, i);
}
printf("%lld\n", ans);
return 0;
}