1 条题解

  • 0
    @ 2025-12-3 9:00:48
    • 同时记录前缀数组的 2 个值:
      • 1、前缀异或和
      • 2、(奇数个数) - (偶数个数)
    #include <bits/stdc++.h>
    using namespace std;
    
    using pii = pair<int, int>;
    
    int solve(vector<int>& a) {
        int n = a.size(), y = 0, s = 0, ans = 0;
    
    	// q[{x, y}] = z: 前缀异或为 x, 奇偶数之差为 y 的最小下标
        map<pii, int> q;
        q[{0, 0}] = 0;
        for (int i = 1; i <= n; i++) {
            y ^= a[i - 1];
            s += (a[i - 1] % 2 ? 1 : -1);
    
    		// 两个前缀和相减, 就可以得到一段连续子数组
    		if (q.count({y, s})) ans = max(ans, i - q[{y, s}]);
            else q[{y, s}] = i;
        }
        return ans;
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0); cout.tie(0);
    
    	int T, n;
    	cin >> T;
    	while (T--) {
    		cin >> n;
    		vector<int> a(n);
    		for (int i = 0; i < n; i++) cin >> a[i];
    		cout << solve(a) << '\n';
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    200
    时间
    100ms
    内存
    32MiB
    难度
    3
    标签
    递交数
    54
    已通过
    28
    上传者