Trie板子复习

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
const int N = 3e6+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
int qmi(int a,int b,int mod){int res=1;while(b){if(b&1)res=res*a%mod;b>>=1;a=a*a%mod;}return res;}


int n,q,m;
const int M = 3e6+10;
int cnt = 1;
struct Trie{
	int x[70],num;
}tree[M];
char s[M];

void pre()
{
	for(int i=0;i<=cnt;++i){
	 	for(int j=0;j<=69;++j){
	 		tree[i].x[j] = 0;
	 	}	
	 	tree[i].num = 0;
	}
}


int getnum(char c)
{
	if(c>='0'&&c<='9')return c-'0';
	if(c>='a'&&c<='z')return c-'a'+10;
	return c-'A'+37;
}


void insert()
{
	int pos=1,len = strlen(s+1);
	for(int i=1;i<=len;++i){
		int num = getnum(s[i]);
		if(!tree[pos].x[num])tree[pos].x[num] = ++cnt;
		pos = tree[pos].x[num];
		tree[pos].num++;
	}
}

int find()
{
	int pos = 1,len = strlen(s+1);
	for(int i=1;i<=len;++i){
		int num = getnum(s[i]);
		if(!tree[pos].x[num])return 0;
		pos = tree[pos].x[num];
	}
	return tree[pos].num;
}






void solve()
{
	cin>>n>>q;
	pre();cnt = 1;
	while(n--){cin>>s+1;insert();}
	while(q--){cin>>s+1;cout<<find()<<"\n";}
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;
	cin>>_;
	//_ = 1;
	while(_--)solve();
	return 0;
}

01trie

解决树上异或问题,维护根节点到每一个点的异或值,转化成O(n)*31 的查询问题

异或具有传递性

先看一道经典的板子

经典的O(n*31)

cpp 复制代码
#include<iostream>
#include<cstring>

using namespace std;
using ll = long long;
using pii = pair<int,int>;
const int N = 1e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
int qmi(int a,int b,int mod){int res=1;while(b){if(b&1)res=res*a%mod;b>>=1;a=a*a%mod;}return res;}


int n,q,m;
const int M = 2e6+10;
struct Trie{
	int x[2],num;
}tree[M];
int cnt = 1;

// int e[N],ne[N],w[N],h[N],idx;
// void add(int a,int b,int c){
	// e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
// }

void insert(int x){
	int pos = 1;
	for(int i=30;i>=0;--i){
		int t = x>>i&1;
		if(!tree[pos].x[t])tree[pos].x[t] = ++cnt;
		pos = tree[pos].x[t];
		tree[pos].num++;
	}
}

int find(int x){
	int pos = 1;
	int res = 0;
	for(int i=30;i>=0;--i){
		int t = x>>i&1;
		if(tree[pos].x[!t]){res+=(1<<i);pos = tree[pos].x[!t];}
		else pos = tree[pos].x[t];
	}
	return res;
}


int a[N];
void solve()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		insert(a[i]);
	}
	
	int res = 0;
	for(int i=1;i<=n;i++)res = max(res,find(a[i]));
	
	cout<<res;
	

}

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;
	//cin>>_;
	_ = 1;
	while(_--)solve();
	return 0;
}

P4551 最长异或路径

注意边权下放的手法

再看一道经典的树上 其实就是上面的套个皮

相关推荐
^^为欢几何^^2 分钟前
lodash中_.difference如何过滤数组
javascript·数据结构·算法
豆浩宇3 分钟前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr
浅念同学18 分钟前
算法.图论-并查集上
java·算法·图论
何不遗憾呢27 分钟前
每日刷题(算法)
算法
立志成为coding大牛的菜鸟.31 分钟前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞32 分钟前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
liangbm338 分钟前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
潮汐退涨月冷风霜43 分钟前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
爬虫·python·深度学习·算法·机器学习·自然语言处理·数据可视化
羊小猪~~1 小时前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn