可持久化Trie详解,最大异或和,k大异或和

零、碎碎念

打比赛没遇上可持久化Trie,做个CMU 15-445的project0,上来就碰上了……

关于Trie详见:[Trie树/字典树的原理及实现C/C++]_trie字典树原理-CSDN博客


一、可持久化Trie

1.1 基本思想

可持久化Trie可持久化线段树类似,因为每次插入只有一条路径走到底,所以不需要每个版本开一棵树。
比如下面就是在01Trie上依次插入[2, 5, 7]的三个版本
在这里插入图片描述

因而,我们动态开点,在上一个版本的基础上,增加新的节点,就得到了新版本的Trie。

为了方便叙述,下面都以01Trie为例。

1.2 Trie基本结构

struct Trie{
    static constexpr int ALPHABET = 2;	// 字符集
    static constexpr int B = 24;	// 二进制位范围
    struct Node{					// 结点定义
        Node():cnt(0), son{} {}
        std::array<int, ALPHABET> son;
        int cnt;
    };

    std::vector<Node> tr;	// 结点池
    std::vector<int> root;	// 各版本根节点

    Trie() {
        tr.emplace_back(Node());
        root.emplace_back(0);	// 初始化空节点0 为 0 号版本 
    }

    int newNode(){				// 动态开点
        tr.emplace_back();
        return (int)tr.size() - 1;
    }

    void add(int v) {}
    int max_xor(int x, int y, int v) {}
};

1.3 插入操作

  • 每插入一个新数字v,都会生成一个新版本的Trie
  • 记新版本编号为y,上一个版本编号为x
  • 按位从高到低遍历v,记当前遍历到第 i 位(位从0开始编号)
  • 令 j = v >> i & 1,那么 j 就是v在 第 i 位的值,即 tr[y].son[j] 是我们要生成的结点
  • 开新点给tr[y].son[i],tr[y].son[!j] 继承 tr[x].son[!j]
  • 遍历完位,插入结束
  • 时间复杂度:O(log v),每个版本只开辟了O(log v)个新结点

代码实现

void add(int v) {
    int x = root.back(), y = newNode();
    root.emplace_back(y);
    for (int i = B - 1; ~i; -- i) {
        int j = v >> i & 1;
        tr[y].son[!j] = tr[x].son[!j];
        tr[y].son[j] = newNode();
        x = tr[x].son[j], y = tr[y].son[j];
        tr[y].cnt = tr[x].cnt + 1;
    }
}

1.4 查询操作

01 Trie 的查询操作一般都是查询最大异或和。

(两两异或第K大查询见OJ练习2.2)

可持久化Trie 支持我们查询任意区间内子序列和任意数字 v 的最大异或和

  • 查询区间[l, r] 对应版本 [l, r],待查询数字v,返回结果为res
  • 令 y = root[r],x = root[l - 1],x 显然是边界,我们不能伸入x以及x左边的版本
  • 按位从高到低遍历v,记当前遍历到第 i 位
  • 令j = v >> i & 1
  • 如果 tr[tr[y].son[!j]].cnt > tr[tr[x].son[!j]].cnt,说明 !j 这条路径上有结点,并且未伸入边界,我们就令 x = tr[x].son[!j], y = tr[y].son[!j],res |= 1 << i
  • 否则 x = tr[x].son[j],y = tr[y].son[j]
  • 遍历结束,返回res

代码实现

    int max_xor(int x, int y, int v) {
        x = root[x], y = root[y];
        int res = 0;
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            if (tr[tr[y].son[!j]].cnt > tr[tr[x].son[!j]].cnt) {
                res |= 1 << i;
                j ^= 1;
            }
            y = tr[y].son[j];
            x = tr[x].son[j];
        }
        return res;
    }

1.5 完整代码

其它功能,根据不同题目,分析编写即可。

struct Trie{
    static constexpr int ALPHAEBT = 2;
    static constexpr int B = 24;
    struct Node{
        Node():cnt(0), son{} {}
        std::array<int, ALPHAEBT> son;
        int cnt;
    };

    std::vector<Node> tr;
    std::vector<int> root;

    Trie() {
        tr.emplace_back(Node());
        root.emplace_back(0);
    }

    int newNode(){
        tr.emplace_back();
        return (int)tr.size() - 1;
    }

    void add(int v) {
        int x = root.back(), y = newNode();
        root.emplace_back(y);
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            tr[y].son[!j] = tr[x].son[!j];
            tr[y].son[j] = newNode();
            x = tr[x].son[j], y = tr[y].son[j];
            tr[y].cnt = tr[x].cnt + 1;
        }
    }

    int max_xor(int x, int y, int v) {
        x = root[x], y = root[y];
        int res = 0;
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            if (tr[tr[y].son[!j]].cnt > tr[tr[x].son[!j]].cnt) {
                res |= 1 << i;
                j ^= 1;
            }
            y = tr[y].son[j];
            x = tr[x].son[j];
        }
        return res;
    }
};

二、OJ练习

2.1 最大异或和

原题链接

P4735 最大异或和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路分析

如果没学过可持久化Trie,我大概会离线处理 + 01Trie + 前缀和来做

但现在不同了,我们可以用可持久化Trie + 前缀和轻松解决

先在Trie中插入0,这是前缀异或和都要设置的哨兵

插入的部分我们选择插入前缀异或和,后面会用到

我们记 前i个数异或和为 s[i]

对于查询的部分,因为插入了0,所以 [l, r] 对应 版本/区间 [l + 1, r + 1]

因为我们选取的后缀不能空,所以相当于 求 s[p] ^ s[p + 1] ^ … ^ s[r] ^ x 的最值(即a[r + 1] 必须取)

然后查询 [l, r] 内和v 的最大异或和即可

因为查询区间是[l, r],所以左边界应该是root[l - 1]

AC代码

#include <bits/stdc++.h>

using i64 = long long;
using u32 = unsigned int;
using u64 = unsigned long long;

struct Trie{
    static constexpr int ALPHAEBT = 2;
    static constexpr int B = 24;
    struct Node{
        Node():cnt(0), son{} {}
        std::array<int, ALPHAEBT> son;
        int cnt;
    };

    std::vector<Node> tr;
    std::vector<int> root;

    Trie() {
        tr.emplace_back(Node());
        root.emplace_back(0);
    }

    int newNode(){
        tr.emplace_back();
        return (int)tr.size() - 1;
    }

    void add(int v) {
        int x = root.back(), y = newNode();
        root.emplace_back(y);
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            tr[y].son[!j] = tr[x].son[!j];
            tr[y].son[j] = newNode();
            x = tr[x].son[j], y = tr[y].son[j];
            tr[y].cnt = tr[x].cnt + 1;
        }
    }

    int max_xor(int x, int y, int v) {
        x = root[x], y = root[y];
        int res = 0;
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            if (tr[tr[y].son[!j]].cnt > tr[tr[x].son[!j]].cnt) {
                res |= 1 << i;
                j ^= 1;
            }
            y = tr[y].son[j];
            x = tr[x].son[j];
        }
        return res;
    }
};

auto FIO = []{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
}();

int main() {
    int n, m;
    std::cin >> n >> m;

    Trie tr;
    tr.add(0);

    int s = 0;

    for (int i = 0, a; i < n; ++ i)
        std::cin >> a, tr.add(s ^= a);

    for (int i = 0, l, r, x; i < m; ++ i) {
        char op;
        std::cin >> op;
        if (op == 'A') {
            std::cin >> x;
            tr.add(s ^= x);
        }
        else {
            std::cin >> l >> r >> x;
            std::cout << tr.max_xor(l - 1, r, s ^ x) << '\n';
        }
    }
    return 0;
}

2.2 异或粽子(kth_max_xor)

原题链接

[P5283 十二省联考 2019] 异或粽子 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路分析

我们选择在01Trie中插入前缀和

那么本题就转换成了求数组中前K大两数异或值之和

我们考虑固定一个右端点,如何求第k大xor?

我们Trie的结点存储了cnt,代表了该路径上该位为0 / 1的方案数

那么类似于 我们在平衡树(如Splay、Treap)上查kth

如果路径可走:

  • cnt >= k,那就走
  • 否则k -= cnt

我们在堆中插入n个位置以及rank = 1时的max_xor

然后弹k次,不断维护即可

时间复杂度:O(k log^2 n)

注意:本代码无法通过本题加强版:https://codeforces.com/problemset/problem/241/B
事实上,可以寻找O(n log^2 n)做法
AC代码

#include <bits/stdc++.h>
// #include <ranges>

using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

constexpr int P = 1'000'000'007;

struct Trie{
    static constexpr int ALPHABET = 2;
    static constexpr int B = 33;
    struct Node{
        std::array<int, ALPHABET> son;
        int cnt;
        Node(): son{}, cnt(0) {}
    };

    std::vector<Node> tr;
    std::vector<int> root;

    Trie(){
        tr.emplace_back(Node());
        root.emplace_back(0);
    }

    int newNode() {
        tr.emplace_back();
        return (int)tr.size() - 1;
    }

    void add(i64 v) {
        int x = root.back(), y = newNode();
        root.emplace_back(y);
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            tr[y].son[!j] = tr[x].son[!j];
            tr[y].son[j] = newNode();
            x = tr[x].son[j], y = tr[y].son[j];
            tr[y].cnt = tr[x].cnt + 1;
        }
    }

    i64 max_xor(int x, int y, int v) {
        x = root[x], y = root[y];
        i64 res = 0;
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            if (tr[tr[y].son[!j]].cnt > tr[tr[x].son[!j]].cnt) {                    
                res |= 1 << i;
                j ^= 1;
            }
            y = tr[y].son[j];
            x = tr[x].son[j];
        }
        return res;
    }

    i64 max_xor(int x, int y, i64 v, int k) {
        x = root[x], y = root[y];
        i64 res = 0;
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            if (tr[tr[y].son[!j]].cnt > tr[tr[x].son[!j]].cnt) {
                if (k <= tr[tr[y].son[!j]].cnt - tr[tr[x].son[!j]].cnt) {
                    res |= 1LL << i;
                    j ^= 1;
                }
                else
                    k -= tr[tr[y].son[!j]].cnt - tr[tr[x].son[!j]].cnt;
            }
            y = tr[y].son[j];
            x = tr[x].son[j];
        }
        return res;    
    }
};


void solve() {
    int n, k;
    std::cin >> n >> k;

    Trie tr;

    std::priority_queue<std::tuple<i64, int, int, i64>> pq;

    i64 s = 0;
    tr.add(0);

    for (int i = 0; i < n; ++ i) {
        i64 a;
        std::cin >> a;
        tr.add(s ^= a);
        pq.emplace(tr.max_xor(0, i + 2, s, 1), i + 2, 1, s);
    }

    i64 res = 0;
    
    while (k --) {
        auto [v, r, rank, a] = pq.top();
        pq.pop();
        res += v;
        ++ rank;
        pq.emplace(tr.max_xor(0, r, a, rank), r, rank, a);
    }

    std::cout << res;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t = 1;
    // std::cin >> t;
    
    while (t--) {
        solve();
    }
    
    return 0;
}

2.3 ALO

原题链接

[P4098 HEOI2013] ALO - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路分析

喔的写法是 单调栈 + ST表 + 可持久化Trie

单调栈处理每个下标左边第一个比自己大的,右边第一个比自己大的

题解有人用链表轻松处理左右第二个大的,但是我没看懂,所以还是写了ST表

然后我们枚举每个数,记 左边第一个大的为l,第二个为ll,同理有r,rr

那么可以作为次大值的区间就是 [ll + 1, r - 1], [l + 1, rr - 1]

在可持久化Trie上查询即可

时间复杂度:O(nlogn)

AC代码

#include <bits/stdc++.h>
// #include <ranges>

using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

constexpr int P = 1'000'000'007;

template<class T, class Func, const int M = 30>
struct ST {
    Func F;
    T n;
    std::vector<T> nums;
    std::vector<int> LOG2;
    std::vector<std::array<T, M>> f;

    ST (const std::vector<T>& _nums) : n(_nums.size()), nums(_nums), LOG2(n + 1), f(n) {
        LOG2[2] = 1;
        for (int i = 3; i <= n; i ++ ) 
            LOG2[i] = LOG2[i >> 1] + 1;
        for (int i = 0; i < n; i ++ )
            f[i][0] = nums[i];
        for (int j = 1; j < M; j ++)
            for (int i = 0; i < n && i + (1 << (j - 1)) < n; i ++) 
                f[i][j] = F(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
    }

    T query(int l, int r) {
        int k = LOG2[r - l + 1];
        return F(f[l][k], f[r - (1 << k) + 1][k]);
    }
};

struct Func{
    int operator()(int x, int y){
        return x > y ? x : y;
    }
};

struct Trie{
    static constexpr int ALPHABET = 2;
    static constexpr int B = 30;
    struct Node{
        std::array<int, ALPHABET> son;
        int cnt;
        Node(): son{}, cnt(0) {}
    };

    std::vector<Node> tr;
    std::vector<int> root;

    Trie(){
        tr.emplace_back(Node());
        root.emplace_back(0);
    }

    int newNode() {
        tr.emplace_back();
        return (int)tr.size() - 1;
    }

    void add(i64 v) {
        int x = root.back(), y = newNode();
        root.emplace_back(y);
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            tr[y].son[!j] = tr[x].son[!j];
            tr[y].son[j] = newNode();
            x = tr[x].son[j], y = tr[y].son[j];
            tr[y].cnt = tr[x].cnt + 1;
        }
    }

    i64 max_xor(int x, int y, int v) {
        x = root[x], y = root[y];
        i64 res = 0;
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            if (tr[tr[y].son[!j]].cnt > tr[tr[x].son[!j]].cnt) {                    
                res |= 1 << i;
                j ^= 1;
            }
            y = tr[y].son[j];
            x = tr[x].son[j];
        }
        return res;
    }

    i64 max_xor(int x, int y, i64 v, int k) {
        x = root[x], y = root[y];
        i64 res = 0;
        for (int i = B - 1; ~i; -- i) {
            int j = v >> i & 1;
            if (tr[tr[y].son[!j]].cnt > tr[tr[x].son[!j]].cnt) {
                if (k <= tr[tr[y].son[!j]].cnt - tr[tr[x].son[!j]].cnt) {
                    res |= 1LL << i;
                    j ^= 1;
                }
                else
                    k -= tr[tr[y].son[!j]].cnt - tr[tr[x].son[!j]].cnt;
            }
            y = tr[y].son[j];
            x = tr[x].son[j];
        }
        return res;    
    }
};

void solve() {
    int n;
    std::cin >> n;

    Trie tr;
    std::vector<int> a(n), pre(n, -1), suf(n, n);

    std::vector<int> st;

    for (int i = 0; i < n; ++ i) {
        std::cin >> a[i];
        tr.add(a[i]);

        while (st.size() && a[i] > a[st.back()]) {
            suf[st.back()] = i;
            st.pop_back();
        }
        if (st.size()) pre[i] = st.back();
        st.push_back(i);
    }

    i64 res = 0;

    ST<int, Func> rmq(a);

    auto getsuf = [&](int lo, int hi, int v) -> int {
        int l = lo;
        int res = -1;
        while (lo <= hi) {
            int x = lo + hi >> 1;
            if (rmq.query(l, x) > v) res = x, hi = x - 1;
            else lo = x + 1;
        }
        return res;
    };

    auto getpre = [&](int lo, int hi, int v) -> int {
        int r = hi;
        int res = -1;
        while (lo <= hi) {
            int x = lo + hi >> 1;
            if (rmq.query(x, r) > v) res = x, lo = x + 1;
            else hi = x - 1;
        }
        return res;
    };

    for (int i = 0; i < n; ++ i) {
        int l = pre[i], r = suf[i];
        int ll = getpre(0, l - 1, a[i]), rr = getsuf(r + 1, n - 1, a[i]);
        if (~l)
            res = std::max(res, tr.max_xor(~ll ? ll + 1 : 0, r < n ? r : n, a[i]));
        if (r < n)
            res = std::max(res, tr.max_xor(~l ? l + 1 : 0, ~rr ? rr : n, a[i]));
    }

    std::cout << res;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t = 1;
    // std::cin >> t;
    
    while (t--) {
        solve();
    }
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/873350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

白小白为波司登新品创作歌曲《登峰之路》,穿越风雨守护前行者

随着天气渐凉&#xff0c;波司登品牌推出全新新品——轻薄羽绒叠变系列&#xff0c;作为波司登品牌的新品推荐官&#xff0c;歌手白小白为波司登创作并演唱《轻薄羽绒叠变》系列主题曲《登峰之路》。歌曲中&#xff0c;白小白以激昂澎湃&#xff0c;明快有力的旋律以及深情又充…

[数据集][目标检测]西红柿缺陷检测数据集VOC+YOLO格式17318张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;17318 标注数量(xml文件个数)&#xff1a;17318 标注数量(txt文件个数)&#xff1a;17318 标…

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0006页 寻找重复数 今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一&#xff0c;是道好题&#xff0c;不过我们还是得先理解了它才…

【Unity小技巧】URP管线遮挡高亮效果

前言 在URP渲染管线环境下实现物体遮挡高亮显示效果&#xff0c;效果如下&#xff1a;Unity URP遮挡高亮 实现步骤 创建层级&#xff0c;为需要显示高亮效果的物体添加层级&#xff0c;比如Player 创建一个材质球&#xff0c;也就是高亮效果显示的材质球找到Universal Render…

react项目搭建、基础知识

前言 教学内容来源于黑马 黑马程序员前端React18入门到实战视频教程&#xff0c;从reacthooks核心基础到企业级项目开发实战 项目搭建 创建项目 pnpm create vite选择框架 选择语言和构建 安装依赖并运行 pnpm install pnpm run dev运行成功 基础知识 文件 main…

极盾故事|某金融租赁机构应用数据保护新策略:“动态脱敏”“二次授权”

数据的流通使用是创新的动力&#xff0c;但安全和合规是不可逾越的底线。企业如何在这三者之间找到平衡点&#xff1f; 极盾科技&#xff0c;助力某金融租赁机构&#xff0c;基于极盾觅踪构建应用数据动态脱敏系统&#xff0c;实现10&#xff0b;核心应用系统的统一管理&#x…

磁电偶极子天线学习1 一种60GHz 宽带圆极化口径耦合磁电偶极子天线阵列

摘要&#xff1a; 一种新型的圆极化口径耦合天线被提出。这种圆极化磁电偶极子天线由刻蚀在短路基片集成波导的一部分的宽臂上&#xff0c;并且很容易被集成基片。在工作频段内实现了宽于28.8%的阻抗带宽和宽带3-dB的25.9%的轴比和的增益。此外&#xff0c;因为圆极化辐射由两个…

ModuleNotFoundError: No module named ‘mmcv.transforms‘

不得已的解决方法&#xff1a; mmcv升级到2.0.0即可解决 升级后自然又面临一系列不兼容问题&#xff01; 官方文档查漏补缺

HNU-2023电路与电子学-实验3

写在前面&#xff1a; 本次实验是完成cpu设计的剩余部分&#xff0c;整体难度比上一次要小&#xff0c;细心完成就能顺利通过全部测评 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能&#xff0c;设计 8 重 3-1 多路复用器。 3.分析模型机的功能…

基于python的Selenium webdriver环境搭建(笔记)

一、PyCharm安装配置Selenium环境 本文使用环境&#xff1a;windows11、Python 3.8.1、PyCharm 2019.3.3、Selenium 3.141.0 测试开发环境搭建综述 安装python和pycharm安装浏览器安装selenium安装浏览器驱动测试环境是否正确 这里我们直接从第三步开始 1.1 Seleium安装…

Python Flask_APScheduler定时任务的正确(最佳)使用

描述 APScheduler基于Quartz的一个Python定时任务框架&#xff0c;实现了Quartz的所有功能。最近使用Flask框架使用Flask_APScheduler来做定时任务&#xff0c;在使用过程当中也遇到很多问题&#xff0c;例如在定时任务调用的方法中需要用到flask的app.app_context()时&#…

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过&#xff0c;这次的华为云F…

一个好用的Maven依赖冲突解决插件:Maven Helper

在项目开发&#xff0c;或项目Maven需要新增依赖、项目依赖组件升级时&#xff0c;经常会出现添加后&#xff0c;因为各个模块中有相同的依赖、不同的版本而导致依赖冲突&#xff0c;从而导致项目启动不起来&#xff0c;这种冲突非常恶心&#xff0c;因为是传递依赖所以会看不出…

vulhub ThinkPHP5.0.23远程代码执行漏洞

1.在vulhub打开环境 进入环境存在的文件 docker-compose up -d 2.浏览器访问环境 3.查看是否存在漏洞 /index.php?scaptcha 页面报错说明有可能存在 4.使用hackbar插件发送post请求 _method__construct&filter[]system&methodget&server[REQUEST_METHOD]dir…

排查SQL Server中的内存不足及其他疑难问题

文章目录 引言I DMV 资源信号灯资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)查询性能计数器什么是内存授予?II DBCC MEMORYSTATUS 查询内存对象III DBCC 命令释放多个 SQL Server 内存缓存 - 临时度量值IV 等待资源池 %ls (%ld)中的内存…

高通智能模组:以卓越优势引领科技潮流

一、高通智能模组的崛起与发展 在通信技术发展中&#xff0c;高通智能模组出现。5G 兴起&#xff0c;对模组有更高要求&#xff0c;高通凭借积累和创新捕捉需求。早期致力于研发 5G 技术&#xff0c;优化技术降低功耗提高处理能力&#xff0c;展现性能优势。在竞争中&#xff0…

剪映剪辑影视视频字幕声音批量自动对齐教程

一款智能软件&#xff0c;用它结合剪映或CapCut 你就可以快速将一个视频翻译为另一种语言&#xff0c;非常适合做TikTok中视频的用户&#xff0c;无论是英语区法语区还是日语区&#xff0c;这款名为谷哥剪映助手的软件都能成倍提升你的剪辑效率。 让我来给大家介绍它的使用方法…

基于移动互联网的校内物业报修管理系统设计与实现(论文+源码)_kaic

基于移动互联网的校内物业报修管理系统设计与实现 摘  要 校园后勤服务对于学校的发展至关重要&#xff0c;它不仅是学校管理的基石&#xff0c;也是实现教育目标的关键因素&#xff0c;为学生提供优质的生活环境。如果学校能够提供出色的后勤保障&#xff0c;让师生无需担心…

【自动驾驶】控制算法(七)离散规划轨迹的误差计算

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

【数据结构与算法】单向链表

【数据结构与算法】单向链表 文章目录 【数据结构与算法】单向链表前言一、单向链表初始化二、单向链表插入与遍历三、单向链表的删除与清空四、单向链表返回长度以及销毁五、完整代码六、单向链表企业版总结 前言 本篇文章就单向链表初始化&#xff0c;插入遍历功能&#xff…