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

Trie树相关算法题java实现

Trie树

Trie字符串统计

思路:

Trie:高效的存储和查找字符串集合的数据结构(字母或数字)

存储从根节点出发,每个单词存储字母,如果不存在就创建,如果存在就继续下一个字母,每个单词完结了记得在结尾打个标签意味着这是单词末尾,查找也很简单,看是否能找到完整字符串并且结尾有标签。如下图所示

在这里插入图片描述

存储结构:int son[N][26],cnt[N],idx;//son[i][j]表示当前下标为i时字母j的子节点cnt是用来存储结尾单词的数量的,下标为0的点即是根节点也是空节点 idx是树的层数

演示案例:

在这里插入图片描述

在这里插入图片描述

代码:

import java.util.*;
public class Main{static int N = 100010,idx = 0;static int[][] son = new int[N][26];static int[] cnt  = new int[N];static char[] str = new char[N];public static  void insert(char[] str){int p = 0; //下标0表示头结点,根节点for(int i = 0 ; i < str.length; i ++ ){// 将字符串每个字符都转化成数字;0-25int u = str[i] - 'a'; //如果这个的儿子分支没有字符,说明这条分支还没有这个字符插入过//就新建一个然后赋值为然后把【idx】下标赋值上去,作为每个分支的专属坐标if(son[p][u] == 0) son[p][u] = ++idx;//然后将p往下前进一层p = son[p][u];}//最后停在那一层的那个数字就做标记,说明这是一个字符串的结束。cnt[p]++;}public static int query(char[] str){int p = 0;//从根节点开始,下标是0表示根节点,头结点for(int i = 0 ; i < str.length; i ++){int u = str[i] - 'a'; // 将字符串每个字符都转化成数字0-25//如果这个点上面没有标记,就说明没有存入过这个字符,所以返回0if(son[p][u] == 0) return 0;//如果这个点上面能寻找到这个字符,就让他往下一层继续寻找;p = son[p][u];}//最后查找完之后输出最后一个做标记的点为下标的cnt数组的值。return cnt[p];}public static void main(String[] args){Scanner scan = new Scanner(System.in);int n = scan.nextInt();String sss = scan.nextLine();while(n -- > 0){String s = scan.nextLine();String[] st = s.split(" ");String s1 = st[0];String s2 = st[1];if(s1.equals("I")){insert(s2.toCharArray());}else{System.out.println(query(s2.toCharArray()));}}}
}

最大异或对

思路

将每个数以二进制方式存入Trie树,找的时候从当前数字最高位去找尽量和该位的相反的点,直到当前数字遍历到最低位,此时通过贪心思想得到的就是和当前数字异或最大的数,把所有数字都找一遍求个max就行。

在这里插入图片描述

在这里插入图片描述

代码

import java.io.*;
public class Main{static int N = 3100010,idx = 0;static int[][] son = new int[N][2];//插入public static void add(int x){int p = 0;//从头结点开始for(int i = 30 ; i >= 0 ; i -- ){ //因为每一个数的二进制是有31位组成,所以需要从大开始遍历int u = x >> i & 1;//每一个数的二进制31个二进制每一位看0还是1if(son[p][u] == 0) son[p][u] = ++idx;//判断这一层是空的,就创建,然后赋值下标p = son[p][u];//然后让往下前进一层}}//查询public static int query(int x){int p = 0,res = 0;//从根节点0开始。res进就算异或后的最大值for(int i = 30; i>= 0 ; i --){int u = x >> i & 1;if(son[p][1-u] != 0){ //如果该节点的u是0,则判断一下在这一层有没有跟他相反的0-1,1-0,如果相反对应位置有数res += (1 << i);//res就将该二进制位对应异或之后的最优解1每一位顺次加起来。因为是异或相反数就是1,这是最优解p = son[p][1-u];//然后往最优解那边前进一层。}else{//否则就不是最优解的0匹配1,1匹配0,所以就异或之后的值是0//res += (0 << i);因为是0所以可以省略,p = son[p][u];//然后让他往不优解那边前进一层。}}return res;//最后返回异或之后的最大值res}public static void main(String[] args)throws IOException{BufferedReader re = new BufferedReader(new InputStreamReader(System.in));BufferedWriter wt = new BufferedWriter(new OutputStreamWriter(System.out));int n = Integer.parseInt(re.readLine());String[] s = re.readLine().split(" ");for(int i = 0 ; i < n ; i ++ ){add(Integer.parseInt(s[i]));}int res  = 0;for(int i = 0 ; i < n ; i ++ ){//因为输入的是字符串所以需要转成整形。然后每一次比较res的值谁大,然后将最大值重新赋值给resres = Math.max(res,query(Integer.parseInt(s[i])));}wt.write(res +" ");//最后输出res,因为快输出输出的是字符串,所以需要在后面加上“ ”;wt.close();}
}
http://www.dtcms.com/a/586468.html

相关文章:

  • (根号分治)nfls #1982 倍数点更新 题解
  • 哪个网站注册域名便宜中小企业网站建设济南兴田德润电话
  • 深圳 网站建设 销售seo的中文含义是
  • ui网站建设wordpress视频设置方法
  • asp网站后台产品管理中增加一个功能怎样修改微信小程序怎么收费
  • 做网站应该画什么图合肥市城乡城乡建设局网站
  • 仓颉编程语言中的Option类型与模式匹配深入解析
  • 达梦数据复制软件DMDRS
  • 做一年的网站维护价格培 网站建设方案 doc
  • 网站地图添加合肥免费做网站
  • Java 11+ HttpClient 实战:从 HttpURLConnection 到现代 HTTP 客户端的全面升级​
  • 广州网站建设信科网络上海十大家装公司排名
  • 重庆站外推广网站wordpress 商城模板下载
  • 徐州做网站的培训机构欧洲美妇做爰网站
  • zencart网站国外可以做会员网站的网站
  • 万网网站备案授权书网站改版 升级的目的
  • 网站建设素材图企业手机网站建设有
  • vue介绍
  • [SCADE航电应用] 达索航电系统与软件的建模
  • 7个常见的Jmeter压测问题
  • 做网站客户改来改去网络服务提供者不得为未满多少岁开展工作
  • 网站建设教的误区微信朋友圈投放广告
  • springboot3基于neety进行设备mqtt服务接收
  • 基于ASP3605的宽输入范围降压转换性能研究
  • 东莞厚街网站建设谷歌代运营
  • 网站备案拍照搭建网站知识
  • 平台网站做代理商网站运维工作内容
  • 三网合一营销型全网站网站开发的响应式和兼容性问题
  • .NET周刊【10月第4期 2025-10-26】
  • 北京市专业网站制作企业网站服务器如何管理