• 异或前缀和


    给出n和n个数,求异或和为0的子段个数
    传送门

    设a[i]为输入的数
    b[i]为异或前缀和
    b[i] = a[1] ^ a[2] ^ ... ^ a[i - 1] ^ a[i]
    已知一个数x^y = 0当且仅当x == y时成立
    那么对于一段[1,r]来说,异或前缀和为b[r],那么如果想要以r为异或为0的子段的右半部分,那么只需要前面出现过一个数b[i] == b[r],那么[i + 1,r]这一段异或和为0
    就比如
    对于(x_{1},x_{2},x_{3} ... x_{r}),如果想要找到一段区间[i,r]使得其区间异或和为0,设(x_{1},x_{2},x_{3}...x_{j})的异或和为(b[j])那么如果b[j] == b[r],也就是说b[j] ^ b[j+1,r] = b[r]而只有x ^ y == x当且仅当y = 0时成立。

    那么只需要前缀异或和+map维护即可

    #include <iostream>
    #include <map>
    #define ll long long
    using namespace std;
    const int maxn = 2e5 + 5;
    std::map<ll, ll> mp;
    ll a[maxn],b[maxn];
    int main(){
    	int n;
    	cin >> n;
    	ll ans = 0;
    	for(int i = 1; i <= n; i++){
    		cin >> a[i];
    		b[i] = a[i] ^ b[i - 1];
    		if(b[i] == 0)ans++;
    		ans += mp[b[i]];
    		mp[b[i]]++;
    		cout << ans << endl;
    	}
    	cout << ans << endl;
    	return 0;
    }
    
  • 相关阅读:
    mysql
    makefile
    KNN算法(k-nearest neighbor)
    时间序列
    python易错题之lambda 以及 for循环中内嵌函数
    python易错题之作用域
    html----不常见标签
    js----DOM对象(3
    js----DOM对象(事件)
    js----对象
  • 原文地址:https://www.cnblogs.com/Emcikem/p/12296228.html
Copyright © 2020-2023  润新知