用来查找是否出现某些单词,或者是求最大亦或和
inline void add(char s[])//插入 { int u=1; for(int i=1;i<=ls;i++) { int v=s[i]-'a'+1; if(!ch[u][v]) { ch[u][v]=++cnt; } u=ch[u][v]; } point[++num]=u; }
inline bool solve(char s[])//查找 { int u=1; for(re i=1;i<=ls;i++) { int v=s[i]-'a'+1; if(!ch[u][v]) return 0; u=ch[u][v]; } return 1; }
#include<bits/stdc++.h>//求最大亦或和 using namespace std; int ch[(4*100005)<<5][3],cnt=1; long long l[4*100005],r[4*100005]; inline void add(int x) { int u=1; for(int i=31;i>=0;i--) { int v=(x&(1<<i))?1:0; if(!ch[u][v]) { ch[u][v]=++cnt; } u=ch[u][v]; } } inline long long work(int x) { int u=1; long long ans=0; for(int i=31;i>=0;i--) { int v=(x&(1<<i))?0:1; if(ch[u][v]) { ans+=(1<<i); u=ch[u][v]; } else { u=ch[u][!v]; } } return ans; } int n,now=0; int x[400005]; long long bns=0; int main() { scanf("%d",&n); add(now); for(int i=1;i<=n;i++) { scanf("%d",&x[i]); now^=x[i]; add(now); l[i]=max(l[i-1],work(now)); } memset(ch,0,sizeof(ch)); add(now=0); for(int i=n;i>=1;i--) { now^=x[i]; add(now); r[i]=max(r[i+1],work(now)); } for(int i=1;i<=n;i++) { bns=max(bns,l[i]+r[i+1]); } printf("%lld",bns); return 0; }
https://www.lydsy.com/JudgeOnline/problem.php?id=4260(题目