首页 > 其他分享 >trie树

trie树

时间:2024-11-01 17:10:35浏览次数:2  
标签:trie res tr son int 异或

  • 顾名思义,trie树是由字典与树的结合体,是一种方便快捷地存储字符串等字符集较小的串集的数据结构(不确定算不算数据结构)
    而其结构是朴素的。trie树的节点本身并没有特殊的含义,其信息更多体现在边上。如下图
    trie1
  • 这是一颗典型的trie树。
    例如我们要表示aba这个字符串,我们就从1->2->6->11,将每条边所代表的字符连接起来就是我们所代表的字符串。

P2580 于是他错误的点名开始了

这道题是trie的模板题。

  • 题意:给定原字符串集合(大小为 \(n\) )和一些字符串询问(大小为 \(m\) )。
    对于每个询问,我们需要求出询问的字符串是否在字符集给定的字符集内。若在,还需判断是否已经被询问过。
    对于每个给定的字符串,其长度 \(len\) 都小于等于50且 \(n\le 1e4,m\le 1e5\)

  • 由于数据规模并不很小,因此不能 \(O(nmlen)\) 地去暴力对比。因此考虑构建trie树。
    对于先前给定的字符集构建trie树后对于每个询问,就直接向下跑寻找有没有就可以了。

  • 但是需要注意,构建trie树后需要给节点设定终止标记。因为有些节点可能只是某个字符串的中间并不是结尾。

code

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,tree[3000005][30],cnt[3000005],id=0,m,tr[3000005];
int getnum(char s)
{
	return s-'a'+1;
}
void insert(string s)
{
	int p=0,len=s.size();
	for(int i=0;i<len;i++)
	{
		int c=getnum(s[i]);
		if(!tree[p][c]) tree[p][c]=++id;
		p=tree[p][c];
	}
	tr[p]=1;
	return;
}
int find(string s)
{
	int p=0,len=s.size();
	for(int i=0;i<len;i++)
	{
		int c=getnum(s[i]);
		if(!tree[p][c]) return -1;
		p=tree[p][c];
	}
	if(!tr[p]) return -1;//末尾标记
	cnt[p]++;
	if(cnt[p]==1) return 1;
	else return 0;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		string s;
		cin>>s;
		insert(s);
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		string s;
		cin>>s;
		int res=find(s);
		if(res==1) cout<<"OK"<<endl;
		if(res==0) cout<<"REPEAT"<<endl;
		if(res==-1) cout<<"WRONG"<<endl;
	}
	return 0;
}

P4551 最长异或路径

  • 题意:给定一颗有 \(n\) 个节点的无根树,每条边有权值。寻找树上的两个节点,使其之间的异或路径最长(指两点间路径上所有边的异或和)

  • 对于每一对节点,显然有 \((u,v)=(root,u)\oplus (root,v)\),这里的括号是指 \(u\) 到 \(v\) 的异或路径。
    因此考虑先求出每个点到根节点(自己随便定一个,一般就是1)的异或路径的值。现在考虑枚举每一个点,求出与其匹配的最优的另一个点的异或路径长度。

  • 事实上,我们并不关心另一个点在哪里,我们只需要求出最优的异或路径是多少就可以了。
    又发现了一个性质:对于两个值,其异或后的值如果要大,那一定是最高位优先。也就是说,如果异或后的值一种最高位大,另一种最高位不大,那第二种一定不优(注意都是在二进制下讨论的)

  • 因此考虑对于每个 \((root,u)\) 的二进制值建立trie树,对于每个枚举的 \((root,u)\) 值,从高到低位枚举,如果这一位有与其相反的数,那就向这边走。
    根据上文的叙述,这种贪心的正确性显然。

code

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e7+7;
int n,tot[N],sum[N],cnt=0;
struct bian
{
	int v,w;
};vector <bian> q[N];
struct node
{
	int son[3];
}tr[N];
void dfs(int u,int fa)
{
	for(int i=0;i<tot[u];i++)
	{
		int v=q[u][i].v,w=q[u][i].w;if(v==fa) continue;
		sum[v]=sum[u]^w;dfs(v,u);
	}
}
void build(int val,int x)
{
	for(int i=(1<<30);i;i>>=1)
	{
		bool c=val&i;
		if(!tr[x].son[c]) tr[x].son[c]=++cnt;
		x=tr[x].son[c];
	}
}
int query(int val,int x)
{
	int res=0;
	for(int i=(1<<30);i;i>>=1)
	{
		int c=val&i;
		if(tr[x].son[!c]) res=res+i,x=tr[x].son[!c];
		else x=tr[x].son[c];
	}
	return res;
}
int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1,u,v,w;i<=n-1;i++)
	{
		cin>>u>>v>>w;
		q[u].push_back({v,w}),tot[u]++;
		q[v].push_back({u,w}),tot[v]++;
	}
	dfs(1,0);for(int i=1;i<=n;i++) build(sum[i],0);
	int ans=0;for(int i=1;i<=n;i++) ans=max(ans,query(sum[i],0));
	cout<<ans<<'\n';return 0;
}

标签:trie,res,tr,son,int,异或
From: https://www.cnblogs.com/allforgod/p/18520846

相关文章

  • RAG(Retrieval-Augmented Generation)技术
    RAG(Retrieval-AugmentedGeneration)技术是一种结合检索与生成能力的知识增强方案,专门用于应对复杂多变的信息查询和生成挑战。其核心在于结合先进的向量数据库与大模型的智能问答能力,使得AI系统能够更准确地理解和回应用户的需求。而混合检索作为RAG技术中的关键组成部分,结......
  • 数据库事务耗时过长导致Could not retrieve transaction read-only status from serve
    背景 [11-0602:02:09:005][ERROR]-DruidDataSource-discardconnectionjava.sql.SQLException:Couldnotretrievetransactionread-onlystatusfromserverCausedby:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communicationslinkfailure......
  • CentOS报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&
    CentOS报错:Couldnotretrievemirrorlisthttp://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock32errorwas14:curl#6-"Couldnotresolvehost:mirrorlist.centos.org;Unknownerror"关于CentOS报错:Couldnotretrievemirr......
  • 使用yum安装报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?relea
    安装wget命令yum-yinstallwget报错,无法找到镜像 测试是否是网络问题抓包正常,网络没有问题;尝试更新yum又开始报错尝试分析问题原因出现这个错误是因为使用的CentOS7仓库已经被归档,当前的镜像地址无法找到所需的文件。CentOS7的官方支持已经结束,部分仓库已被移至归档......
  • Trie
    835.Trie字符串统计模板题:维护一个字符串集合,支持两种操作:Ix向集合中插入一个字符串x;Qx询问一个字符串在集合中出现了多少次。共有N个操作,所有输入的字符串总长度不超过10^5,字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包......
  • DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed
    前言DBeaver连接mysql报错:PublicKeyRetrievalisnotallowed遇到"PublicKeyRetrievalisnotallowed"错误时,通常意味着你正在使用的身份验证方法需要加密连接,但是没有正确地配置客户端或服务器来支持这种加密。解决第一种可以在连接字符串中添加 allowPublicKey......
  • P6105 [Ynoi2010] y-fast trie
    这可能也是一个关于匹配的经典trick。题意给定常数\(C\),你需要维护一个集合\(S\),支持以下操作:1x,加入数\(x\),保证\(x\)之前不存在。2x,删除数\(x\),保证\(x\)之前存在。每次操作后你需要回答$$\max_{i,j\inS,i\not=j}(i+j)\bmodC$$\(Q\le5\times10^5\),强制在......
  • 易优CMS出现:Allowed memory size of 134217728 bytes exhausted (tried to allocate 2
    当你遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误时,这意味着PHP的内存限制已经耗尽。这种错误通常发生在处理大量数据或执行复杂计算时。为了解决这个问题,可以采取以下几种方法:方法1:修改 php.ini 文件(推荐)找到 php......
  • 易优CMS登录后台报Allowed memory size of 134217728 bytes ex hausted (tried to alo
    当你在登录后台时遇到“Allowedmemorysizeof134217728bytesexhausted(triedtoallocate20480bytes)”的错误提示时,通常是由于PHP的内存限制不足导致的。以下是一些具体的解决步骤:步骤1:检查PHP配置登录宝塔面板登录宝塔面板。在左侧菜单栏选择“软件商店”。......
  • 字典Trie树
    题目描述维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。共有 N (1≤N≤2×10^4) 个操作,输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,......