牛客网【每日一题】4月14日题目精讲 Xorto
文章目錄
- 題目描述
- 題解:
- 代碼:
- 擴展
傳送
時間限制:C/C++ 2秒,其他語言4秒 空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format:%lld
題目描述
給定一個長度為n的整數數組,問有多少對互不重疊的非空區間,使得兩個區間內的數的異或和為0。 輸入描述: 第一行一個數n表示數組長度;
第二行n個整數表示數組; 1<=n<=1000,0<=數組元素<100000。
輸出描述:
一行一個整數表示答案。
示例1
輸入
輸出
5說明
([1,1],[2,2]),([1,1],[3,3]),([1,1],[2,3]),([1,2],[3,3]),([2,2],[3,3])
題解:
枚舉?TLE√
暴力肯定過不了,我們可以先考慮只枚舉一個區間[x,y],這個區間可以通過前綴異或和得到。pre來存前綴
我們用[x,y]表示右邊的區間,題目要求左右區間異或和為0,也就是問[x,y]左邊有多少和它值一樣的區間。
我們可以用a[i]來存,a[i]表示左邊異或和為i區間個數,數組a反應的數量,i反映的是值。
先將區間[k,i]存進a中,再用a[ ]來查看左邊有多少區間異或和值與右區間[i+1 , j]值相同。
因為a存的是數量,所以直接用ans+=a [ pre[i] ^ [j] ]
代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=1e7+3; int a[maxn]; int pre[maxn];int x;int n; long long ans=0; int main() {cin>>n;for(int i=1;i<=n;i++){cin>>x;pre[i]=pre[i-1]^x;}for(int i=1;i<=n;i++){for(int k=0;k<i;k++) a[pre[i]^pre[k]]++;//for(int j=i+1;j<=n;j++) ans += a[pre[i]^pre[j]];//}cout<<ans;return 0; }擴展
關于異或的題我最近做了個
CF282E Sausage Maximization
??途W題目鏈接
異或的題,解法挺新穎,不過不知道為什么??途W這里不能 提交?
原題是cf的cf題目鏈接
我自己寫的題解
總結
以上是生活随笔為你收集整理的牛客网【每日一题】4月14日题目精讲 Xorto的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 市面上的数学规划求解器都有哪些?
- 下一篇: Music Problem