case多條件分支語句以及shell中的特殊變數
阿新 • • 發佈:2022-04-06
可持久化Trie的又一個板子。
插入很好說,直接用insert就可以了。查詢其實也還好,我們知道異或有一些好用的性質,比如:
\[A\oplus A=0 \]所以令
\[s_i=a_1\oplus a_2\oplus\cdots\oplus a_i \]則有
\[a_l\oplus a_{l+1}\oplus\cdots\oplus a_r=s_{l-1}\oplus s_r \]所以要求
\[a[p]\oplus a[p+1]\oplus\cdots\oplus a[N]\oplus x(p\in[l,r]) \]的最大值,就是要求
\[s_{p-1}\oplus s_N\oplus x(p\in[l,r]) \]的最大值。後面的部分是確定不變的,所以問題就變成了一個可持久化Trie上跑01Trie求異或和最大值的板子了。(打那麼多公式只是因為新學了一個Latex很興奮)
其它便沒有什麼了。要注意的就是當l為1時查詢區間會覆蓋到0號位置,需要特殊處理一下。程式碼:
#include<cstdio> //#define zczc const int N=600010; const int S=32; inline void read(int &wh){ wh=0;int f=1;char w=getchar(); while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();} while(w>='0'&&w<='9'){wh=wh*10+w-'0';w=getchar();} wh*=f;return; } inline bool op(){ char w=getchar(); while(w!='A'&&w!='Q')w=getchar(); return w=='A'; } int m,n; int root[N],cnt; struct node{ int ch[2],data; }t[N*S]; inline void insert(int pl,int val){ int x=root[pl-1];int y=root[pl]=++cnt; for(int i=S-1;i>=0;i--){ int now=((val>>i)&1); t[y].ch[!now]=t[x].ch[!now]; t[y].ch[now]=++cnt; y=t[y].ch[now],x=t[x].ch[now]; t[y].data=pl; } } inline int work(int l,int x,int val){ int an=0; for(int i=S-1;i>=0;i--){ an<<=1;int now=((val>>i)&1); int want=t[x].ch[!now]; if(want!=0&&t[want].data>=l)an++,x=want; else x=t[x].ch[now]; } return an; } signed main(){ #ifdef zczc freopen("in.txt","r",stdin); #endif read(m);read(n); int s1,s2,s3,num=0,all=0; insert(++num,0); while(m--){read(s1);all^=s1;insert(++num,all);} while(n--){ if(op()){read(s1);all^=s1;insert(++num,all);} else{ read(s1);read(s2);read(s3); printf("%d\n",work(s1,root[s2],all^s3)); } } return 0; }