【数据结构】字典树

模板 于是他错误的点名开始了

时间复杂度 O ( n ∣ S ∣ ) O(n|S|) O(n∣S∣)

cpp 复制代码
const int N=1e6+5,C=1e6+10,mod=1e9+7,inf=1e9+10;
struct trie{
    //计数数组 访问次数 孩子数组
    int cnt[N],tp[N],ch[N][30];
    int id=0;
    void insert(string s){//插入每一个字符串
        int p=0;
        for(auto c:s){
            int j=c-'a';
            if(!ch[p][j])ch[p][j]=++id;//孩子没有编号的安排编号
            p=ch[p][j];//跳到孩子
            //cnt[p]++放在这里 记录经过的次数
        }
        cnt[p]++;//记录每个串个数
    }
    void query(string s){//询问每个字符串状态
        int p=0;//和insert大致相同
        for(auto c:s){
            int j=c-'a';
            if(!ch[p][j])return cout<<"WRONG"<<endl,void();
            p=ch[p][j];
        }
        tp[p]++;
        if(cnt[p]==0)cout<<"WRONG"<<endl;
        else if(tp[p]>1)cout<<"REPEAT"<<endl;
        else cout<<"OK"<<endl;
    }
}t;
void solve() {
	int n,m;cin>>n;
    forr(i,1,n){
        string s;cin>>s;
        t.insert(s);
    }
    cin>>m;
    forr(i,1,m){
        string s;cin>>s;
        t.query(s);
    }
    cout<<t.id<<endl;
}

最长异或路径

cpp 复制代码
const int N=1e6+5,C=1e6+10,mod=1e9+7,inf=1e9+10;
struct trie{
    int ch[N*32][2],id=0;
    void insert(int s){
        int p=0;
        reforr(i,0,30){
            int j=s>>i&1;//从高位到低位 从上到下
            if(!ch[p][j])ch[p][j]=++id;
            p=ch[p][j];
        }
    }
    int query(int s){
        int p=0,res=0;
        reforr(i,0,30){
            int j=s>>i&1;
            if(ch[p][!j]){
                res+=(1<<i);
                p=ch[p][!j];
            }else p=ch[p][j];
        }
        return res;
    }
}t;
vector<pii>e[N];
int sum[N];
void dfs(int now,int fa){
    for(auto [x,w]:e[now]){
        if(fa==x)continue;
        sum[x]=w^sum[now];
        dfs(x,now);
    }
}
void solve() {
	int n;cin>>n;
    forr(i,1,n-1){
        int u,v,w;cin>>u>>v>>w;
        e[u].push_back({v,w});
        e[v].push_back({u,w});
    }
    dfs(1,0);
    forr(i,1,n)t.insert(sum[i]);//把x->1的异或路径值放进去
    int ans=0;
    forr(i,1,n)ans=max(ans,sum[i]);
    forr(i,1,n)ans=max(ans,t.query(sum[i]));//两两最大异或和
    cout<<ans<<endl;
}
相关推荐
We་ct12 分钟前
LeetCode 42. 接雨水:双指针解法深度剖析与全方法汇总
前端·算法·leetcode·typescript
液态不合群21 分钟前
如何提升 C# 应用中的性能
开发语言·算法·c#
诗远Yolanda22 分钟前
EI国际会议-通信技术、电子学与信号处理(CTESP 2026)
图像处理·人工智能·算法·计算机视觉·机器人·信息与通信·信号处理
程序员-King.26 分钟前
day165—递归—最长回文子序列(LeetCode-516)
算法·leetcode·深度优先·递归
学嵌入式的小杨同学29 分钟前
【嵌入式 C 语言实战】栈、队列、二叉树核心解析:存储原理 + 应用场景 + 实现思路
linux·c语言·网络·数据结构·数据库·后端·spring
BHXDML31 分钟前
推导神经网络前向后向传播算法的优化迭代公式
神经网络·算法·机器学习
2401_8414956432 分钟前
【LeetCode刷题】删除链表的倒数第N个结点
数据结构·python·算法·leetcode·链表·遍历·双指针
叫我:松哥42 分钟前
基于YOLO深度学习算法的人群密集监测与统计分析预警系统,实现人群密集度的实时监测、智能分析和预警功能,支持图片和视频流两种输入方式
人工智能·深度学习·算法·yolo·机器学习·数据分析·flask
你撅嘴真丑42 分钟前
STL练习
开发语言·c++·算法
苦藤新鸡1 小时前
28.两数相加,进位制
数据结构·算法·链表·力扣