Xor sum HDU - 6955
Xor sum HDU - 6955
題意:
給定一個長度為n的整數序列,求其XOR和不小于k的最短連續子序列。
如果有多個相同長度的連續子序列,則打印具有最小左端點的連續子序列。
如果沒有連續的子序列開關XOR總和不小于k,只需打印“-1”。
題解:
有關01串且求異或值相關內容,一般都用01字典樹,本題也不例外
本題如何維護字典樹呢?
我們先求出所有的前綴異或和[1,P],當前在Q的位置,我們尋找一個離Q最近的一個數,使得Q ^ P>=K。每次查詢時,(此時字典樹中只插入了Q之前的所有前綴異或和),都會從字典數的高位枚舉到低位,如果K的第J位是1,為了保證Q ^ P>=K,Q ^ P的值也必須是1,那么P和Q的第J位就要不同,也就是我們要向Q的第J位相反的方向尋找,即 c = (Q>>j)&1尋找nxt[now][c ^ 1]。
如果K的第J位是0,此時Q^P的第J位可以是0或1,如果是1后面就不用比較了,已經大于K了,所以如果有1,即nxt[now][c ^ 1]存在,我們就記錄最大的flag[],然后我們要向net[now][c]的方向尋找。為什么?先講下flag[]表示的該異或值出現位置的最后的一次位置,也就是flag的值會盡可能靠近Q,這樣才會讓區間最小。我們在插入時維護flag,使得每個點都有最大的flag,當上面說的nxt[now][c ^ 1],此時K的第J位是0,我們不用再去走1這條路,因為已經比K大了,后面的也一定大于K,所以取最大flag即可,但是如果net[now][c]還是要繼續走,因為目前還不知道是否大于等于K
(講的有些亂,可以看看代碼,代碼很清晰)
代碼:
#include<bits/stdc++.h> #define debug(a,b) printf("%s = %d\n",a,b); typedef long long ll; using namespace std; //qdu打鐵匠 const ll INF=0x3f3f3f3f; inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } const int maxn=1e7; ll nex[maxn][3], cnt=0; ll flag[210000000]; ll k; struct trie {void insert(ll x,ll pos){int p =0;for(int i=29; i>=0; i--){ll c=((x>>i)&1);if (!nex[p][c]){nex[p][c] = ++cnt;flag[cnt]=-1;nex[cnt][1]=nex[cnt][0]=0;} // 如果沒有,就添加結點p = nex[p][c];flag[p]=max(flag[p],pos);}}ll find(ll x){ll ma=-1;ll p=0;for(int i=29; i>=0; i--){ll c=((x>>i)&1);ll ok=((k>>i)&1);if(ok==0){if(nex[p][c^1])ma=max(ma,flag[nex[p][c^1]]);p=nex[p][c];}else{p=nex[p][c^1];}if(p==0)return ma;}return max(ma,flag[p]);} } tree; ll a[1111111]; signed main() {ll t;t=read();while(t--){ll n;n=read();k=read();for(int i=1; i<=n; i++){a[i]=read();a[i]^=a[i-1];}for(int i=0; i<=cnt; i++){nex[i][0]=0;nex[i][1]=0;flag[i]=0;}cnt=0;ll ansl=0,ansr=n;ll ma;for(int i=1; i<=n; i++){ma=-1;ll x=tree.find(a[i]);if(x!=-1){ma=max(x,ma);}if(i-ma<ansr-ansl&&ma>0){ansl=ma;ansr=i;}tree.insert(a[i],i);}if(ansl>0){printf("%d %d\n",ansl+1,ansr);}else{printf("-1\n");}} }總結
以上是生活随笔為你收集整理的Xor sum HDU - 6955的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么查看网站是否降权(怎么查看网站是否降
- 下一篇: 贸易公司怎么写开发信(贸易公司怎么写开发