Submission #343489

#TimeUsernameProblemLanguageResultExecution timeMemory
343489nandonathanielXOR (IZhO12_xor)C++14
100 / 100
573 ms98180 KiB
#include<bits/stdc++.h> using namespace std; const int LOG=30,RAND=8e6+5; int child[2][RAND],anak[RAND],parent[RAND]; unordered_map<int,int> sudah,ujung; int s,ret,n,k,x,i; void ngisi(int tmp,int pos){ if(pos==-1)return; if(child[0][tmp]!=-1 && child[1][tmp]!=-1){ anak[tmp]=min(anak[child[0][tmp]],anak[child[1][tmp]]); } else if(child[1][tmp]!=-1){ anak[tmp]=anak[child[1][tmp]]; } else if(child[0][tmp]!=-1){ anak[tmp]=anak[child[0][tmp]]; } ngisi(parent[tmp],pos-1); } void insert(int tmp,int pos){ if(pos==-1){ sudah[s]=tmp; return; } int now=s&(1<<pos); if(now>0)now=1; if(child[now][tmp]==-1){ ret++; child[now][tmp]=ret; parent[child[now][tmp]]=tmp; anak[child[now][tmp]]=i+1; } insert(child[now][tmp],pos-1); } int search(int tmp,int pos){ if(child[0][tmp]==-1 && child[1][tmp]==-1)return RAND; int bitk=k&(1<<pos),bits=s&(1<<pos); if(bitk>0)bitk=1; if(bits>0)bits=1; int res=RAND; if(bitk==1){ if(bits==1){ if(child[0][tmp]!=-1){ res=min(res,search(child[0][tmp],pos-1)); } } else{ if(child[1][tmp]!=-1){ res=min(res,search(child[1][tmp],pos-1)); } } } else{ if(bits==0){ if(child[0][tmp]!=-1){ res=min(res,search(child[0][tmp],pos-1)); } if(child[1][tmp]!=-1){ res=min(res,anak[child[1][tmp]]); } } else{ if(child[1][tmp]!=-1){ res=min(res,search(child[1][tmp],pos-1)); } if(child[0][tmp]!=-1){ res=min(res,anak[child[0][tmp]]); } } } return res; } int main(){ memset(child,-1,sizeof(child)); scanf("%d%d",&n,&k); anak[s]=1; insert(0,LOG-1); ujung[s]=1; int pjg=-1,awal; for(i=1;i<=n;i++){ scanf("%d",&x); s^=x; int L=search(0,LOG-1); if(ujung.count(k^s))L=min(L,ujung[k^s]); if(L>=1 && L<=i){ if(i-L+1>pjg){ pjg=i-L+1; awal=L; } } if(!sudah.count(s)){ insert(0,LOG-1); } ngisi(sudah[s],LOG-1); if(!ujung.count(s))ujung[s]=i+1; } printf("%d %d\n",awal,pjg); return 0; }

Compilation message (stderr)

xor.cpp: In function 'int main()':
xor.cpp:79:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   79 |  scanf("%d%d",&n,&k);
      |  ~~~~~^~~~~~~~~~~~~~
xor.cpp:85:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   85 |   scanf("%d",&x);
      |   ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...