首页 > 其他分享 >CF815 D2 Xor-Subsequence (hard version)(01trie)

CF815 D2 Xor-Subsequence (hard version)(01trie)

时间:2022-08-21 21:24:59浏览次数:97  
标签:ch Xor 01trie int max hard dep bit now

传送门
sb题面误导了我半天。
按位考虑,
对于 \(a[i]\)和\(i\)的一位考虑什么样的\(a[j]\)和\(j\)可以转移过来,发现这一位有一种一定可以一种一定不行,还有两种不确定。
考虑魔改\(01trie\)每一个节点\(4\)个儿子,但是这样\(01trie\)会\(T\)。
发现不确定的两种情况\(a[j]\)和\(j\)这一位的异或值一定。
所以可以把\(01trie\)的\(4\)个儿子按异或值两两合并,每一个儿子维护两种情况的\(dp\)值。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10000000;
int ch[N][2],mx[N][2],a[N],dp[N]; 
int read(){
	int sum=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
	return sum*f;
}
int tot=0;
void add(int x,int y,int w,int dep,int &now){
	if(now==0)now=++tot;
	if(dep==-1)return;
	int bit_x=(x>>dep)&1,bit_y=(y>>dep)&1;
	add(x,y,w,dep-1,ch[now][bit_x^bit_y]);
	mx[ch[now][bit_x^bit_y]][bit_y]=max(mx[ch[now][bit_x^bit_y]][bit_y],w);
}
int get_max(int x,int y,int dep,int now){
	if(now==0)return 0;
	if(dep==-1)return 0;
	int bit_x=(x>>dep)&1,bit_y=(y>>dep)&1;
	if(bit_x==0&&bit_y==1)return max(mx[ch[now][0]][0],get_max(x,y,dep-1,ch[now][1]));
	if(bit_x==0&&bit_y==0)return max(mx[ch[now][1]][0],get_max(x,y,dep-1,ch[now][0]));
	if(bit_x==1&&bit_y==0)return max(mx[ch[now][0]][1],get_max(x,y,dep-1,ch[now][1]));
	if(bit_x==1&&bit_y==1)return max(mx[ch[now][1]][1],get_max(x,y,dep-1,ch[now][0]));
}
int root;
int main(){
	int T=read();
	while(T--){
		int n=read();
		for(int i=1;i<=n;i++)a[i]=read();
		int ans=0;
		root=0;
		for(int i=1;i<=n;i++){
			dp[i]=max(1,get_max(i-1,a[i],30,root)+1);
			add(i-1,a[i],dp[i],30,root);
			ans=max(ans,dp[i]);
		}
		cout<<ans<<endl;
		for(int i=0;i<=tot;i++){
			mx[i][0]=mx[i][1]=ch[i][0]=ch[i][1]=0;
		}
		tot=0;
	}
	return 0;
} 

标签:ch,Xor,01trie,int,max,hard,dep,bit,now
From: https://www.cnblogs.com/Xu-daxia/p/16610882.html

相关文章

  • cf1254 B2. Send Boxes to Alice (Hard Version)
    题意:给定非负数组,每次操作可以选一个\(a_i\neq0\),令\(a_i\)减一,\(a_i\)相邻的一个数(如果存在)加一。问最少几次操作能使所有数有\(>1\)的公因数\(n,a_i\le1e6\)......
  • 【搜索】力扣126:单词接龙 II(过于hard)
    给定一个起始字符串和一个终止字符串,以及一个单词表,求是否可以将起始字符串每次改一个字符,直到改成终止字符串,且所有中间的修改过程表示的字符串都可以在单词表里找到。若......
  • Codeforces Round #815 (Div. 2) D2 Xor-Subsequence (hard version)
    原题链接\(A>B\),总是有二进制下从高到低的前\(k\)位相等,第\(k+1\)位\(A\)是\(1\),\(B\)是\(0\)本题中\(A=a_i\oplusj\),\(B=a_j\oplusi\),这里有一个很奇妙的性质(手玩或者......
  • CF1196D2 RGB Substring (hard version)
    https://www.luogu.com.cn/problem/CF1196D2前缀和黄色题思路:看当前输入要被修改的这个字符串的第i位,是否与'R','G','B'三个中的一个相等,不相等的另外两个则增加一次修......
  • D2. Xor-Subsequence (hard version)
    D2.Xor-Subsequence(hardversion)昨天cf的E题,挺好的一个DP优化问题。暴力的DP就是设dp[i]表示以i结尾的最长长度。转移时枚举之前的所有j,复杂度O(n^2)。考虑怎么优......
  • 一张图看懂 OrchardCore 中的模块加载及依赖管理
    先上图   Manifest.cs  Module与FeatureModule特性 如果模块中只有一个功能【Feature】那么可以直接用Module替代,也就是///<summary>///......
  • Shardingsphere-ShardingSphere-JDBC-Spring Boot配置-分片规则
    spring.shardingsphere.datasource.names=#省略数据源配置,请参考用法#标准分表配置spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes=#......
  • CF1712E1/E2 LCM Sum (easy/hard version)
    Description给定\(l\)、\(r\),求\(l\)到\(r\)之间有多少三元组\((i,j,k)\),满足\(\operatorname{lcm}(i,j,k)\gei+j+k\)且\(i\ltj\ltk\)。Easyversion共有......
  • Sharding-JDBC使用
    Sharding-JDBC使用一、分库分表1.1为何要分库分表传统的将数据集中存储至单一节点的解决方案,在性能、可用性和运维成本这三方面已经难于满足海量数据的场景从性能方......
  • 【luogu CF1710C】XOR Triangle(数位DP)
    XORTriangle题目链接:luoguCF1710C题目大意给你一个数n,要你求有多少个满足条件的a,b,c使得它们两两异或得到的三个值可以得到一个非退化三角形。其中a,b,c值域在......