【ULR #1】打击复读 (SAM, DAG链剖分)
好牛的题。 DAG链剖分好牛的 trick。
题意
给定一个字符集大小为 4 4 4,长度为 n n n 的字符串 S S S,同时给定两个长度为 n n n 的数组 { w l i } , { w r i } \{wl_i\}, \{wr_i\} {wli},{wri}。
定义一个字符串 T T T 的左权值为
v l ( T ) = ∑ S i , i + ∣ T ∣ − 1 = T w l i vl(T) = \sum\limits_{S_{i, i + |T| - 1} = T} wl_i vl(T)=Si,i+∣T∣−1=T∑wli
右权值为
v r ( T ) = ∑ S i − ∣ T ∣ + 1 , i = T w r i vr(T) = \sum\limits_{S_{i - |T| + 1, i} = T} wr_i vr(T)=Si−∣T∣+1,i=T∑wri
你需要求 ∑ l ≤ r v l ( S l , r ) × v r ( S l , r ) \sum\limits_{l \leq r} vl(S_{l, r}) \times vr(S_{l, r}) l≤r∑vl(Sl,r)×vr(Sl,r)。同时还有 q q q 次修改,每次将一个 w l u wl_u wlu 改成 v v v。你也需要回答出每次修改后的答案,答案对 2 64 2^{64} 264 取模。
1 ≤ n , q ≤ 5 × 10 5 1 \leq n,q \leq 5 \times 10^5 1≤n,q≤5×105
分析:
首先因为我们要快速求修改某个 w l i wl_i wli 后的答案,所以考虑求出每个 w l i wl_i wli 的系数 f l i fl_i fli,这样可以 O ( 1 ) O(1) O(1) 修改答案。
那么对于一个 w l i wl_i wli,它什么时候会被用到呢?
首先很容易分析出本质相同的字符串对答案的贡献相同,因此我们只考虑本质不同的字符串。
那么当且仅当计算 左端点为 i i i,右端点为 [ i , n ] [i, n] [i,n] 这 n − i + 1 n - i + 1 n−i+1 个本质不同字符串的答案时,会用到 w l i wl_i wli。
考虑一个暴力的想法:枚举 j ∈ [ i , n ] j \in [i, n] j∈[i,n],考虑计算 S i , j S_{i, j} Si,j 对 w l i wl_i wli 系数的贡献。我们建出 S A M SAM SAM,假设 S i , j S_{i, j} Si,j 定位到了 p p p 节点,那么 ∣ e n d p o s ( p ) ∣ |endpos(p)| ∣endpos(p)∣ 就是 S i , j S_{i, j} Si,j 会被计算的次数, ∑ x ∈ e n d p o s ( p ) w r x \sum\limits_{x \in endpos(p)} wr_x x∈endpos(p)∑wrx 就是每次对 w l i wl_i wli 系数的贡献。
因此设 g p = ∣ e n d p o s ( p ) ∣ × ∑ x ∈ e n d p o s ( p ) w r x g_p = |endpos(p)| \times \sum\limits_{x \in endpos(p)}wr_x gp=∣endpos(p)∣×x∈endpos(p)∑wrx,那么 g p g_p gp 是非常容易求的,并且我们能看出 f l i = ∑ p ∈ P ( i ) g p fl_i = \sum\limits_{p \in P(i)} g_p fli=p∈P(i)∑gp,其中 P ( i ) P(i) P(i) 表示左端点为 i i i,右端点在 [ i , n ] [i, n] [i,n] 这 n − i + 1 n - i + 1 n−i+1 个字符串对应的节点集合。
实际上,根据 S A M SAM SAM 自动机的性质,可以直到我们从 S A M SAM SAM 的起点 s s s 出发,按照 S i , n S_{i, n} Si,n 中的字符顺序每次走一条转移边就能到达 P ( i ) P(i) P(i) 中的所有节点。
这样处理每个 f l i fl_i fli 的复杂度 O ( n ) O(n) O(n),总复杂度 O ( n 2 ) O(n^2) O(n2)。考虑优化。
我们想要加速在 D A G DAG DAG 上游走过程,考虑 D A G DAG DAG 链剖分:
对于一张 D A G DAG DAG,如果它的 0 0 0 度点个数大于 1 1 1,那么新建虚拟源点向这些 0 0 0 度点连边,使得 0 0 0 度点个数为 1 1 1,称这个 0 0 0 度点为源点。
设 f i f_i fi 表示 源点到 i i i 号点的路径数量, g i g_i gi 表示 i i i 为起点,终点任意的路径数量。
那么定义 D A G DAG DAG 上一条边 ( u , v ) (u, v) (u,v) 为 重边 当且仅当 u u u 是 v v v 所有入点中 f f f 最大的 并且 v v v 是 u u u 的所有出点中 g g g 最大的。
重边以外的所有边称作 轻边。
不难发现,重边将 D A G DAG DAG 剖分成了若干条链,不同链之间靠轻边连接。
在 D A G DAG DAG 上游走,每移动一次 f f f 都会增大, g g g 都会减小。并且每走过一条轻边,要么 f f f 翻倍,要么 g g g 除以 2 2 2,因此 任意一条路径经过的轻边数量不超过 log V \log V logV。换言之,它只会和 log V \log V logV 条重链有交。其中 V V V 是 D A G DAG DAG 上的路径总条数。
也由此我们能够看出: D A G DAG DAG 链剖分的适用条件是路径总数不多。而 S A M SAM SAM 由于每条路径都对应了一个本质不同子串,因此它的总路径条数是 O ( n 2 ) O(n^2) O(n2) 量级的,所以 S A M SAM SAM 与 D A G DAG DAG 链剖分结合是很自然的。
接着回到原来我们要优化的问题上,我们要加速求解 D A G DAG DAG 上一条路径的信息,那么发现这个东西和刚才说的 D A G DAG DAG 链剖分是恰好相适的:预处理每条链上 g g g 的前缀和,然后每次加上一条重链上一段的信息,再暴力跳到下一段即可。单次的复杂度就是 O ( log 2 V ) O(\log_2 V) O(log2V)。
还有一个问题是怎么快速求路径和一段重链交的长度:我们维护指针 j j j,表示 [ i , n ] [i, n] [i,n] 的字符串还剩下 [ j , n ] [j, n] [j,n]。那么只需要求当前节点到所在重链底部将重边上的字母依次拼接形成的字符串和 [ j , n ] [j, n] [j,n] 的 最长公共前缀 l c p lcp lcp 的长度即可。发现一条重链也对应了一个子串:设链底节点的一个 e d p edp edp 为 p p p,链长为 l l l,那么它对应了 S [ p − l + 1 , l ] S_{[p - l + 1, l]} S[p−l+1,l]。只需要求出 S A SA SA 的 h e i g h t height height 数组就可以用 s t st st 表 O ( 1 ) O(1) O(1) 查询 l c p lcp lcp。
总复杂度 O ( n log 2 V ) = O ( n log 2 ( n 2 ) ) = O ( n log 2 n ) O(n \log_2 V) = O(n \log_2(n^2)) = O(n \log_2 n) O(nlog2V)=O(nlog2(n2))=O(nlog2n)。
CODE:
// DAG 链剖分: 适用于路径条数 V 比较小的DAG。 常与SAM结合
// 使用 DAG 链剖分可以快速求原本需要在 DAG(SAM) 上 O(n) 游走来求解的信息
// 单次复杂度 logV
#include<bits/stdc++.h>
#define pb emplace_back
using namespace std;
typedef unsigned long long ull;
const int N = 5e5 + 10;
int n, m, idx[300], str[N];
char S[N];
ull fl[N], wl[N], wr[N];
struct SA {int m, sa[N], rk[N], height[N], x[N * 2], y[N * 2], c[N];int mn[20][N];inline void get_sa() {m = 3;for(int i = 1; i <= n; i ++ ) c[x[i] = str[i]] ++;for(int i = 1; i <= m; i ++ ) c[i] += c[i - 1];for(int i = n; i >= 1; i -- ) sa[c[x[i]] --] = i;for(int k = 1; k <= n; k <<= 1 ) { // 按照 k 排好序了, 现在排 2 * k int num = 0;for(int i = n - k + 1; i <= n; i ++ ) y[++ num] = i;for(int i = 1; i <= n; i ++ ) if(sa[i] > k) y[++ num] = sa[i] - k;for(int i = 0; i <= m; i ++ ) c[i] = 0;for(int i = 1; i <= n; i ++ ) c[x[i]] ++;for(int i = 1; i <= m; i ++ ) c[i] += c[i - 1];for(int i = n; i >= 1; i -- ) sa[c[x[y[i]]] --] = y[i], y[i] = 0;swap(x, y);x[sa[1]] = 1, num = 1;for(int i = 2; i <= n; i ++ ) x[sa[i]] = (y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k]) ? num : ++ num;if(num == n) break;m = num;}}inline void get_height() {for(int i = 1; i <= n; i ++ ) rk[sa[i]] = i;for(int i = 1, k = 0; i <= n; i ++ ) { // 依次确定 [1, n] 后缀在 sa 数组上的 height if(rk[i] == 1) continue;if(k) k --;int j = sa[rk[i] - 1];while(i + k <= n && j + k <= n && str[i + k] == str[j + k]) k ++;height[rk[i]] = k;}}inline void build_st() {for(int i = 1; i <= n; i ++ ) mn[0][i] = height[i];for(int i = 1; (1 << i) <= n; i ++ ) for(int j = 1; j + (1 << i) - 1 <= n; j ++ ) mn[i][j] = min(mn[i - 1][j], mn[i - 1][j + (1 << i - 1)]);}int query(int l, int r) {int k = log2(r - l + 1);return min(mn[k][l], mn[k][r - (1 << k) + 1]);}inline int lcp(int l1, int r1, int l2, int r2) {int u = rk[l1], v = rk[l2];if(u == v) return min(r1 - l1 + 1, r2 - l2 + 1);if(u > v) swap(u, v);return min({query(u + 1, v), r1 - l1 + 1, r2 - l2 + 1});}inline void build() {get_sa(); get_height();build_st();}
} sa;
struct SAM {struct Node {int fa, len;int ch[4];} node[N * 2];int tot = 1, last = 1;ull f[N * 2], g[N * 2], cnt[N * 2], sw[N * 2]; // f: 1 -> i; g: i -> ?vector< ull > sum[N * 2];vector< int > chain[N * 2];int edp[N * 2], bel[N * 2], bot[N * 2], pos[N * 2], Len[N * 2], in[N * 2], mxin[N * 2], mxou[N * 2];bool vis[N * 2];vector< int > E[N * 2];vector< int > G[N * 2];inline void extend(int c, int pos) {int p = last, np = last = ++ tot;node[np].len = node[p].len + 1; cnt[np] ++; sw[np] += wr[pos]; edp[np] = pos;for(; !node[p].ch[c] && p; p = node[p].fa) node[p].ch[c] = np;if(!p) node[np].fa = 1;else {int q = node[p].ch[c];if(node[q].len == node[p].len + 1) node[np].fa = q;else {int nq = ++ tot;node[nq] = node[q]; node[nq].len = node[p].len + 1;for(; node[p].ch[c] == q && p; p = node[p].fa) node[p].ch[c] = nq;node[q].fa = node[np].fa = nq;}}}void dfs(int x) {if(vis[x]) return ;vis[x] = 1; g[x] = 1;for(int i = 0; i < 4; i ++ ) if(node[x].ch[i]) dfs(node[x].ch[i]), g[x] += g[node[x].ch[i]];}void bfs(int s) {for(int i = 1; i <= tot; i ++ )for(int j = 0; j < 4; j ++ ) if(node[i].ch[j]) in[node[i].ch[j]] ++;queue< int > q; q.push(s); f[s] = 1;while(!q.empty()) {int u = q.front(); q.pop();for(int i = 0; i < 4; i ++ ) if(node[u].ch[i]) {in[node[u].ch[i]] --; f[node[u].ch[i]] += f[u];if(!in[node[u].ch[i]]) q.push(node[u].ch[i]);}}}void Dfs(int x) {for(auto v : G[x]) {Dfs(v); cnt[x] += cnt[v]; sw[x] += sw[v]; edp[x] = max(edp[x], edp[v]);}}void DFS(int x, int b, int p) {bel[x] = b; bot[b] = x; Len[b] = p; pos[x] = p;if(p == 1) sum[b].pb(0), chain[b].pb(0);sum[b].pb(cnt[x] * sw[x]); chain[b].pb(x);for(auto v : E[x]) DFS(v, b, p + 1);}inline void build() {for(int i = 1; i <= n; i ++ ) extend(str[i], i);dfs(1); bfs(1);for(int i = 1; i <= n * 2; i ++ ) {for(int j = 0; j < 4; j ++ ) {int u = node[i].ch[j];if(!u) continue;if(g[u] > g[mxou[i]]) mxou[i] = u;if(f[i] > f[mxin[u]]) mxin[u] = i;}}for(int i = 1; i <= tot; i ++ ) if(mxin[mxou[i]] == i) E[i].pb(mxou[i]), in[mxou[i]] ++;for(int i = 2; i <= tot; i ++ ) G[node[i].fa].pb(i);Dfs(1);for(int i = 1; i <= tot; i ++ ) if(!in[i]) {DFS(i, i, 1);for(int j = 1; j <= Len[i]; j ++ ) sum[i][j] += sum[i][j - 1];}}
} sam;
inline ull ask(int l, int r) {int u = 1; ull ret = 0; int cnt = 0;while(l <= r) {int len = sa.lcp(l, r, sam.edp[sam.bot[sam.bel[u]]] - (sam.Len[sam.bel[u]] - sam.pos[u]) + 1, sam.edp[sam.bot[sam.bel[u]]]);ret += sam.sum[sam.bel[u]][sam.pos[u] + len] - sam.sum[sam.bel[u]][sam.pos[u]]; // 减去链头 l += len; cnt ++;if(l <= r) {u = sam.node[sam.chain[sam.bel[u]][sam.pos[u] + len]].ch[str[l]];ret += sam.cnt[u] * sam.sw[u]; l ++;}}return ret;
}
int main() {idx['A'] = 0, idx['T'] = 1, idx['G'] = 2, idx['C'] = 3; scanf("%d%d", &n, &m); scanf("%s", S + 1); for(int i = 1; i <= n; i ++ ) str[i] = idx[S[i]];for(int i = 1; i <= n; i ++ ) scanf("%llu", &wl[i]);for(int i = 1; i <= n; i ++ ) scanf("%llu", &wr[i]);sam.build(); sa.build();ull ret = 0;for(int i = 1; i <= n; i ++ ) {fl[i] = ask(i, n); ret += fl[i] * wl[i];}for(int i = 0; i <= m; i ++ ) {if(i == 0) printf("%llu\n", ret);else {int u; ull v; scanf("%d%llu", &u, &v);ret -= fl[u] * wl[u];wl[u] = v; ret += fl[u] * wl[u];printf("%llu\n", ret);}}return 0;
}
相关文章:
【ULR #1】打击复读 (SAM, DAG链剖分)
好牛的题。 DAG链剖分好牛的 trick。 题意 给定一个字符集大小为 4 4 4,长度为 n n n 的字符串 S S S,同时给定两个长度为 n n n 的数组 { w l i } , { w r i } \{wl_i\}, \{wr_i\} {wli},{wri}。 定义一个字符串 T T T 的左权值为 v l ( T…...
Web3 领域中的一些专业术语
1. Uniswap 是什么: Uniswap 是一个去中心化的交易所,运行在以太坊区块链上,相当于一个“无人管理的货币兑换市场”。它允许用户直接用加密钱包(如 MetaMask)交换不同类型的数字货币(称为代币)…...
Vue组件通信方式及最佳实践
1. Props / 自定义事件 (父子通信) 使用场景 父子组件直接数据传递 代码实现 <!-- Parent.vue --> <template><Child :message"parentMsg" update"handleUpdate" /> </template><script setup> import { ref } from vue…...
JUC并发编程(下)
五、共享模型之内存 JMM(java内存模型) 主存:所有线程共享的数据(静态成员变量、成员变量) 工作内存:每个线程私有的数据(局部变量) 简化对底层的控制 可见性 问题 线程t通过r…...
Go语言中new与make的深度解析
在 Go 语言中,new 和 make 是两个用于内存分配的内置函数,但它们的作用和使用场景有显著区别。 理解它们的核心在于: new(T): 为类型 T 分配内存,并将其初始化为零值,然后返回一个指向该内存的指针 (*T)。make(T, ar…...
Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用
一、FPGA 在线升级 FPGA 在线升级FLASH时,一般是通过逻辑生成SPI接口操作FLASH,当然也可以通过其他SOC经FPGA操作FLASH,那么FPGA就要实现在启动后对FLASH的控制。 对于7Series FPGA,只有CCLK是专用引脚,SPI接口均为普…...
redisson-spring-boot-starter 版本选择
以下是更详细的 Spring Boot 与 redisson-spring-boot-starter 版本对应关系,按照 Spring Boot 主版本和子版本细分: 1. Spring Boot 3.x 系列 3.2.x 推荐 Redisson 版本:3.23.1(最新稳定版,兼容 Redis 7.x…...
QML定时器Timer和线程任务WorkerScript
定时器 Timer 属性 interval: 事件间隔毫秒repeat: 多次执行,默认只执行一次running: 定时器启动triggeredOnStart: 定时器启动时立刻触发一次事件 信号 triggered(): 定时时间到,触发此信号 方法 restart(): 重启定时器start(): 启动定时器stop(): 停止…...
Jsoup解析商品信息具体怎么写?
使用 Jsoup 解析商品信息是一个常见的任务,尤其是在爬取电商网站的商品详情时。以下是一个详细的步骤和代码示例,展示如何使用 Jsoup 解析商品信息。 一、准备工作 确保你的项目中已经添加了 Jsoup 依赖。如果你使用的是 Maven,可以在 pom.…...
jenkins数据备份
jenkins数据备份一般情况下分为两种, 1.使用crontab进行备份.这种备份方式是技术人员手动填写的备份的时候将workspace目录排除. 2.使用jenkins插件备份. 下载备份插件 ThinBackup,这里已经下载完成,如果没下载的情况下点击 安装好之后重启jenkins(直接点击插件安装位置的闲…...
IP核警告,Bus Interface ‘AD_clk‘: ASSOCIATED_BUSIF bus parameter is missing.
创建IP核生成输出的clk信号无法在GUI(customization GUI)显示clk信号,并且出现如下2个warning: [IP_Flow 19-3153] Bus Interface AD_clk: ASSOCIATED_BUSIF bus parameter is missing. [IP_Flow 19-4751] Bus Interface AD_clk:…...
Nginx配置同一端口不同域名或同一IP不同端口
以下是如何在Nginx中配置同一端口不同域名,以及同一IP不同端口的详细说明: 一、同一端口不同域名(基于名称的虚拟主机) 场景: 通过80端口,让 example.com 和 test.com 指向不同的网站目录(如 /…...
一键启动多个 Chrome 实例并自动清理的 Bash 脚本分享!
目录 一、📦 脚本功能概览 二、📜 脚本代码一览 三、🔍 脚本功能说明 (一)✅ 支持批量启动多个 Chrome 实例 (二)✅ 每个实例使用独立用户数据目录 (三)✅ 启动后自…...
LLaMA-Adapter
一、技术背景与问题 1.1 传统方法的数学局限 二、LLaMA-Adapter 核心技术细节 2.1 Learnable Adaption Prompts 的设计哲学 这种零初始化注意力机制的目的是在训练初期稳定梯度,避免由于随机初始化的适配提示带来的不稳定因素。通过门控因子gl的自适应调整,在训…...
鸿蒙电脑系统和统信UOS都是自主可控的系统吗
鸿蒙电脑系统(HarmonyOS)和统信UOS(Unity Operating System)均被定位为自主可控的操作系统,但两者的技术背景、研发路径和生态成熟度存在差异,需结合具体定义和实际情况分析: 1. 鸿蒙系统&#…...
【Unity 如何使用 Mixamo下载免费模型/动画资源】Mixamo 结合在 Unity 中的实现(Animtor动画系统,完整配置以及效果展示)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Mixamo介绍1、网址2、Mixamo功能介绍Mixamo 的核心功能Mixamo 适用场景二、Mixamo下载免费模型三、Mixamo下载免费动画四、导入Unity1.人物模型配置2.动画配置五、场景配置和效果测试1.人物…...
linux文件重命名命令
Linux文件重命名指南 方法一:mv命令(单文件操作) mv 原文件名 新文件名基础用法示例: mv old_file.txt new_name.txt保留扩展名技巧: mv document-v1.doc document-v2.doc方法二:rename命令(…...
JavaScript-DOM-02
自定义属性: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…...
跨部门项目管理优化:告别邮件依赖
1. 工具整合 1.1 协作平台集中化 1.1.1 一体化协作工具优势 使用Microsoft Teams、Slack等一体化协作工具替代邮件,集成即时消息、文件共享、任务分配和视频会议功能,减少工具切换成本,提高沟通效率。 1.1.2 具体应用案例 在Teams中创建项目频道,关联任务看板(Planner)…...
ADB常用语句
目录 基本语句 pm 包管理操作 查看文件夹内容 查看文件内容 删除文件 dumpsys查看系统服务状态 logcat保存日志 日志级别 基本语句 查看是否安装成功 adb version查看是否连接成功 adb devices断开连接 adb disconnect进入安卓系统 adb shell 退出安卓系统 exit…...
阿里发布扩散模型Wan VACE,全面支持生图、生视频、图像编辑,适配低显存~
项目背景详述 推出与目的 Wan2.1-VACE 于 2025 年 5 月 14 日发布,作为一个综合模型,旨在统一视频生成和编辑任务。其目标是解决视频处理中的关键挑战,即在时间和空间维度上保持一致性。该模型支持多种任务,包括参考到视频生成&a…...
谷歌开源轻量级多模态文本生成模型:gemma-3n-E4B-it-litert-preview
一、Gemma 3n模型概述 1.1 模型简介 Gemma 3n是Google DeepMind开发的一系列轻量级、最先进的开源模型。这些模型基于与Gemini模型相同的研究和技术构建,适合多种内容理解任务,如问答、摘要和推理等。 1.2 模型特点 Gemma 3n模型专为在资源受限设备上…...
【Linux】了解 消息队列 system V信号量 IPC原理
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、了解消息队列 ✨消息队列函数 🍔ftok() --- 系统调用设置key 🍔 msgget() 🍔msgctl() 🍔msgsnd() ✨消息队列的管理指令 二、了…...
Git Clone 原理详解:为什么它比本地文件复制更快? -优雅草卓伊凡
Git Clone 原理详解:为什么它比本地文件复制更快? -优雅草卓伊凡 今天有朋友问我:“为什么 git clone 下载文件这么快?而我在本地复制粘贴文件时,速度却慢得多?” 这个问题很有意思,因为它涉及…...
高级认知型Agent
目标: 构建一个具备自主规划、多步推理、工具使用、自我反思和环境交互能力的智能代理,使其能够高效、可靠地完成复杂任务。 核心理念: Agent的智能涌现于一个精密的认知循环: 感知 (Perceive) -> 理解与规划 (Think/Plan - 想) -> 信息获取 (Search/Act - 查) -&g…...
网络爬虫(Web Crawler)详解
网络爬虫(Web Crawler)详解 1. 基本概念与核心目标 定义: 网络爬虫是一种自动化的程序,通过HTTP协议访问网页,提取并存储数据(如文本、链接、图片),并根据策略递归访问新链接。核心目标: 数据采集:抓取特定网站或全网公开数据。索引构建:为搜索引擎提供页面内容(如…...
SQL 数值计算全解析:ABS、CEIL、FLOOR与ROUND函数深度精讲
一、问题拆解:数值计算需求分析 1.1 业务需求转换 题目:在numbers表中计算每个数值的绝对值、向上取整、向下取整和四舍五入值。 关键分析点: 需要对同一字段进行四种不同的数学运算每种运算对应一个特定的SQL数学函数需保持原始数据完整…...
智能导览系统多语言解说与AI问答功能:从deepseek到景区知识图谱的构建
本文面向 文旅行业技术决策者、GIS 开发者、AI 算法工程师,旨在解决不够智能化导致游客体验不足的核心痛点,提供从技术选型到落地部署的全链路解决方案。 如需获取智慧景区导览系统解决方案请前往文章最下方获取,如有项目合作及技术交流欢迎私…...
10.18 LangChain ToolMessage实战:多轮交互与状态管理全解析
使用 ToolMessage 管理工具调用输出 关键词:LangChain ToolMessage, 工具调用管理, 多轮交互控制, 状态持久化, 输出解析 1. ToolMessage 的定位与价值 在 LangChain v0.3 的 Agent 工作流中,ToolMessage 是专门用于管理工具调用输出的消息类型,主要解决以下核心问题: #m…...
linux基础操作11------(运行级别)
一.前言 这个是linux最后一章节内容,主要还是介绍一下,这个就和安全有关系了,内容还是很多的,但是呢,大家还是做个了解就好了。 二.权限掩码 运行级别 0 关机 运行级别 1 单用户 ,这个类似于windows安全…...
Python Ray 扩展指南
Python Ray 扩展指南 Ray 是一个开源的分布式计算框架,专为扩展 Python 应用程序而设计,尤其在人工智能和机器学习领域表现出色。它提供了简单的 API,使开发者能够轻松编写并行和分布式代码,而无需关注底层复杂性。以下是关于 Py…...
笑林广记读书笔记三
《锯箭杆》 一人往观武场,飞箭误中其臂。请外科医治疗,医遂用小锯截其外露箭杆,即索谢礼。 问:“内截箭头如何?” 医曰:“此是内科的事,你去找他们。” 白话翻译: 有…...
npm、pnpm、yarn 各自优劣深度剖析
在前端开发领域,包管理工具是开发者的得力助手,它们负责处理项目中的依赖安装、更新与管理。npm、pnpm、yarn 是目前最主流的三款包管理工具,它们在功能上有诸多相似之处,但在实际使用中又各有优劣。本文将结合包管理工具常见问题…...
Ulisses Braga-Neto《模式识别和机器学习基础》
模式识别和机器学习基础 [专著] Fundamentals of pattern recognition and machine learning / (美)乌利塞斯布拉加-内托(Ulisses Braga-Neto)著 ; 潘巍[等]译 推荐这本书,作者有自己的见解,而且提供代码。问题是难度高,对于初学…...
python查询elasticsearch 获取指定字段的值的list
from elasticsearch import Elasticsearch from datetime import datetime, timedelta# 1.connect to Elasticsearch------------------------------------------------------------------------------------------------------ # prod连接到 Elasticsearch es_of_prod Elasti…...
百度Q1财报:总营收325亿元超预期 智能云同比增速达42%
发布 | 大力财经 5月21日晚,百度发布2025年第一季度财报,显示一季度总营收达325亿元,百度核心营收255亿元,同比增长7%,均超市场预期。一季度,百度核心净利润同比增48%至76.3亿元,智能云持续强劲…...
BurpSuite Montoya API 详解
文章目录 前言1. API 结构1.1 概述1.2 API文件源码解析 2. BurpExtension 接口3. MontoyaApi接口4. package burp.api.montoya.proxy4.1 Proxy 接口4.2 ProxyRequestHandler接口4.3 Demo 5. BurpSuite burpSuite()6. Extension extension()7. Http http()参考 前言 我们已经学…...
oracle使用SPM控制执行计划
一 SPM介绍 Oracle在11G中推出了SPM(SQL Plan management),SPM是一种主动的稳定执行计划的手段,能够保证只有被验证过的执行计划才会被启用,当由于种种原因(比如统计信息的变更)而导致目标SQL产生了新的执…...
YCKC【二分查找专题】题解
数的范围题解点击跳转题目链接:数的范围 比较经典的二分查找例题,不做过多赘述。注意看二分的对象以及最终想求什么:想求尽可能大 ,那么就是最大值类型的二分;想求尽可能小,就是最小值类型的二分。注意二分…...
【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案
一、第三方接口治理的核心挑战与架构设计 1.1 不稳定接口的典型特征 维度表现影响范围响应时间P99超过2秒,波动幅度大(如100ms~5s)导致前端超时,用户体验恶化错误率随机返回5xx/429,日均故障3次以上核心业务流程中断,交易失败率上升协议不一致多版本API共存,字段定义不…...
关于FPGA 和 ASIC设计选择方向的讨论
FPGA 和 IC 设计怎么选?哪个发展更好? 一句话总结: 如果你学历极高,追求高薪资、愿意投入长期学习,目标是进入大型芯片公司,建议走 IC(ASIC)设计;如果你更看重灵活性、创…...
项目中常用的docker指令
1. docker ps 查看当前正在运行的容器。 docker ps -a 这将列出所有容器,包括停止运行的。 2. docker exec 在已经运行的容器中执行命令的工具 启动一个交互式 Bash 会话 docker exec -it my-container bash介绍 docker exec 命令 docker exec 是 Docker 提供的…...
以加减法计算器为例,了解C++命名作用域与函数调用
************* C topic: 命名作用域与函数调用 ************* The concept is fully introducted in the last artical. Please refer to 抽象:C命名作用域与函数调用-CSDN博客 And lets make a calculator to review the basic structure in c. 1、全局函数 A…...
MySQL EXPLAIN 使用详解与执行计划分析优化
MySQL EXPLAIN 使用详解与执行计划分析优化 一、什么是 EXPLAIN? EXPLAIN 是 MySQL 提供的 SQL 语句分析工具,可以显示 SQL 语句在执行时的执行计划,包括表的访问顺序、使用的索引、连接类型、扫描行数等。通过分析 EXPLAIN 的输出结果&…...
Arthas:Java诊断利器实战指南
在Java应用开发和运维中,线上问题排查往往是一场与时间的赛跑。传统的日志分析、重启大法或JVM工具(如jstack、jmap)虽然有效,但存在操作复杂、无法实时追踪等问题。Arthas作为阿里巴巴开源的Java诊断工具,凭借无需重启…...
一文读懂迁移学习:从理论到实践
在机器学习和深度学习的快速发展历程中,数据和计算资源成为了制约模型训练的关键因素。当我们面对新的任务时,重新训练一个从头开始的模型往往耗时耗力,而且在数据量不足的情况下,模型的性能也难以达到理想状态。这时,…...
ElasticSearch安装
ElasticSearch 脑图知识图谱地址:ProcessOn Mindmap|思维导图 简介 ES是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建,专为处理海量数据设计,支持实时搜索、分析和可视化。 排行第一的搜索引擎 官网地址࿱…...
c#中添加visionpro控件(联合编程)
vs添加vp控件 创建窗体应用 右键选择项 点击确定 加载CogAcqfifoTool工具拍照 设置参数保存.vpp 保存为QuickBuild或者job, ToolBlock 加载保存的acq工具 实例化相机工具类 //引入命名空间 using Cognex.VisionPro; //实例化一个相机工具类 CogAcqFifoTool cogAcqFifoTool n…...
MySQL主键与外键详解:数据关系的基石与守护者
引言 在数据库设计中,主键(Primary Key)和外键(Foreign Key)是构建数据关系模型的核心工具。它们不仅保障了数据的唯一性和完整性,还实现了跨表数据关联的逻辑闭环。本文将通过实例解析这两大关键概念&…...
Go语言打造:超高性能分布式唯一ID生成工具
一、简介 这是一个超高性能唯一ID生成工具,支持docker一键部署,提供API接入功能支持高性能生成Snowflake ID、Sonyflake ID、UUID v1、UUID v4、XID、KSUID以及自定义ID的服务可以用来生成订单编号、学号、高标准唯一标识、有序ID等等开源地址参考&#…...