luoguP5283[12성 연합고사 2019]이종 또는 종자
슈퍼 피아노와 유사하게 가장 좋은 해답을 찾아 지속 가능한trie.
code:
#include
using namespace std;
#define re register
typedef long long ll;
const int maxn=5*1e5+10;
int n,m,tot;
int root[maxn],last[maxn*40*2];
int trie[maxn*40][2];
ll ans;
ll a[maxn],sum[maxn];
struct node
{
int x,l,r,t;ll val;
bool operatorq;
inline ll read()
{
char c=getchar();ll res=0,f=1;
while(c'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
void insert(int pre,int now,int t,ll k,int id)
{
if(t<0){last[now]=id;return;}
int c=(k>>t)&1;
if(pre)trie[now][c^1]=trie[pre][c^1];
trie[now][c]=++tot;
insert(trie[pre][c],trie[now][c],t-1,k,id);
last[now]=max(last[trie[now][0]],last[trie[now][1]]);
}
int query(int now,int t,ll k,int lim)
{
if(t<0)return last[now];
int c=(k>>t)&1;
if(last[trie[now][c^1]]>=lim)return query(trie[now][c^1],t-1,k,lim);
else return query(trie[now][c],t-1,k,lim);
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
n=read(),m=read();
for(re int i=1;i<=n;i++)a[i]=read(),sum[i]=sum[i-1]^a[i];
root[0]=++tot;last[0]=-1;insert(0,root[0],35,0,0);
for(re int i=1;i<=n;i++)root[i]=++tot,insert(root[i-1],root[i],35,sum[i],i);
for(re int i=1;i<=n;i++)
{
int pos=query(root[n],35,sum[i-1],i);
//cerr<now.l)
{
int pos=query(root[now.t-1],35,sum[now.x-1],now.l);
q.push((node){now.x,now.l,now.t-1,pos,sum[now.x-1]^sum[pos]});
}
if(now.t
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.