当前位置: 首页 > news >正文

赛前训练4 extra 字典树

A

板子。

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define int long long
using namespace std;const int N=1e6+5,M=48;
int n,m,tot;
string s[N];
int trie[N][M],exist[N];void insert(string s){int cur=0;for(int i=0;i<s.size();i++){int ch=s[i]-'a';if(!trie[cur][ch])trie[cur][ch]=++tot;cur=trie[cur][ch];}exist[cur]++;
}
int search(string s){int cur=0,ans=0;for(int i=0;i<s.size();i++){int ch=s[i]-'a';if(!trie[cur][ch])return ans;cur=trie[cur][ch];ans+=exist[cur];}return ans;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m;for(int i=1;i<=n;i++)cin>>s[i],insert(s[i]);while(m--){string t;cin>>t;cout<<search(t)<<'\n';}return 0;
}

B

01-trie 板子。

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define int long long
using namespace std;const int N=3e6+5;
int n,tot;
int a[N],trie[N][2];void insert(int x){int cur=0;for(int i=31;i>=0;i--){int k=(x>>i)&1;if(!trie[cur][k])trie[cur][k]=++tot;cur=trie[cur][k];}
}
int search(int x){int ans=0,cur=0;for(int i=31;i>=0;i--){int k=(x>>i)&1;if(trie[cur][k^1])ans+=(k^1)<<i,cur=trie[cur][k^1];elseans+=k<<i,cur=trie[cur][k];}return ans;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n;for(int i=1;i<=n;i++)cin>>a[i],insert(a[i]);int ans=-1e18;for(int i=1;i<=n;i++){int now=search(a[i])^a[i];ans=max(ans,now);}cout<<ans;return 0;
}

C

见题解。

D

考虑到异或是不进位的加法,说明 \(x \in [0,2 \times 10^6]\)

我们枚举 \(x\),这样 \(x,k\) 都能定下来,于是只要确定有多少个 \(a_i\)

\(a_i\) 全部扔进 01-trie 里头,画一下图分析,可分两种情况:若 \(k\) 当前位为 \(1\),则 \(x\) 的当前位的那个分支上的 \(a_i\) 全都可以选,我们仅需找另外一侧的;若为 \(0\),则必须走 \(x\) 的当前位的那个分支。

注意,最后需要加上恰好 \(= k\) 的情形。

实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define int long long
using namespace std;const int N=3e7+5;
int n,k,tot;
int a[N],trie[N][2],cnt[N];void insert(int x){int cur=0;for(int i=31;i>=0;i--){int xi=(x>>i)&1;if(!trie[cur][xi])trie[cur][xi]=++tot;cur=trie[cur][xi];cnt[cur]++;}
}
int search(int x){int cur=0,ans=0;for(int i=31;i>=0;i--){int xi=(x>>i)&1,ki=(k>>i)&1;if(ki)ans+=cnt[trie[cur][xi]],cur=trie[cur][xi^1];elsecur=trie[cur][xi];if(!cur)return ans;}if(cur)ans++;return ans;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i],insert(a[i]);int ans=-1e18;for(int x=0;x<=(int)(2e6);x++)ans=max(ans,search(x));cout<<ans;return 0;
}

总结:

  • 01-trie 画图与分析技巧:从高到低位依次对齐 01-trie 的每一层,分析如何在树上走(通常需要分类讨论)。
http://www.gsyq.cn/news/14993.html

相关文章:

  • CF1450E Capitalism
  • Python语言自动玩游戏的数字拼图游戏程序代码ZXQMQZQ
  • 2025 年玻璃钢水箱厂家 TOP 企业品牌推荐排行榜,30 吨,订做,消防,专业,方形,拼装式,屋顶,大型玻璃钢水箱推荐这十家公司!
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频语义理解与智能检索进阶 - 实践
  • 2025 年磨粉机厂家 TOP 企业品牌推荐排行榜,新型磨粉机,超细磨粉机,立式双动力磨粉机,节能磨粉机公司推荐!
  • (数据结构)链表OJ——刷题练习 - 实践
  • electron 安装失败
  • 机器学习15:自监督式学习(Self-Supervised Learning)① - 实践
  • 10.1 CSP模拟26 改题记录
  • Spring 核心 - AOP 面向切面编程入门, 通俗易懂
  • Window配置WSL(Ubuntu)环境
  • Hexo搭建/部署个人博客教程 - 实践
  • WPF Prism IModule,IEventAggregaor GetEvent Publish Subscribe
  • 贝尔数
  • ubuntu安装pbc库
  • 二分图判定,染色法
  • 机器学习 深度学习发展简史(简化版)
  • 完整教程:AI行业应用全景:从金融风控到智能制造的落地实践与技术解析
  • 完整教程:量子机器学习深度探索:从原理到实践的全面指南
  • lazyVIM整体介绍、常用功能和插件
  • 2025 年浮动密封厂家 TOP 企业品牌推荐排行榜,矿用,工程机械,矿山机械,煤矿井下,煤矿机械浮动密封推荐这十家公司!
  • 2025年浮动油封厂家TOP企业品牌推荐排行榜,深度剖析技术创新与产品性能矿用,工程机械,矿山机械,煤矿井下,煤矿机械油封推荐这十家公司!
  • 2025年掘进机厂家权威推荐榜:实力品牌与技术创新深度解析
  • 2025舒适轮胎权威推荐榜:静音科技与驾乘体验口碑之选
  • 2025冷水机定制厂家 TOP 企业品牌推荐排行榜,工业,防爆,低温,水冷,螺杆,超低温,满液式,降膜,气悬浮,变频冷水机厂家推荐这十家公司
  • 实用指南:第四届云计算、大数据应用与软件工程国际学术会议(CBASE 2025)
  • PWN手成长之路-06-watevr_2019_voting_machine_1-栈溢出+劫持
  • 解决vite构建下 disthtml 无法打开问题
  • 语音合成技术
  • PowerShell 提供程序和驱动器(七)