1. 程式人生 > 其它 >case多條件分支語句以及shell中的特殊變數

case多條件分支語句以及shell中的特殊變數

link

可持久化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;
}