当前位置: 首页 > news >正文

【失配树 KMP+树上倍增】P5829失配树|省选-

本文涉及知识点

较难理解的字符串查找算法KMP
树上倍增

P5829 【模板】失配树

题目描述

给定一个字符串 s s s,定义它的 k k k 前缀 p r e k \mathit{pre}_k prek 为字符串 s 1 … k s_{1\dots k} s1k k k k 后缀 s u f k \mathit{suf}_k sufk 为字符串 s ∣ s ∣ − k + 1 … ∣ s ∣ s_{|s|-k+1\dots |s|} ssk+1s,其中 1 ≤ k ≤ ∣ s ∣ 1 \le k \le |s| 1ks

定义 B o r d e r ( s ) \bold{Border}(s) Border(s)对于 i ∈ [ 1 , ∣ s ∣ ) i \in [1, |s|) i[1,s),满足 p r e i = s u f i \mathit{pre}_i = \mathit{suf}_i prei=sufi 的字符串 p r e i \mathit{pre}_i prei 的集合。 B o r d e r ( s ) \bold{Border}(s) Border(s) 中的每个元素都称之为字符串 s s s border ⁡ \operatorname{border} border

m m m 组询问,每组询问给定 p , q p,q p,q,求 s s s p \boldsymbol{p} p 前缀 q \boldsymbol{q} q 前缀最长公共 border ⁡ \operatorname{border} border 的长度。

输入格式

第一行一个字符串 s s s

第二行一个整数 m m m

接下来 m m m 行,每行两个整数 p , q p,q p,q

输出格式

对于每组询问,一行一个整数,表示答案。若不存在公共 border ⁡ \operatorname{border} border,请输出 0 0 0

输入输出样例 #1

输入 #1

aaaabbabbaa
5
2 4
7 10
3 4
1 2
4 11

输出 #1

1
1
2
0
2

输入输出样例 #2

输入 #2

zzaaccaazzccaacczz
3
2 18
10 18
3 5

输出 #2

1
2
0

说明/提示

样例 2 2 2 说明:

对于第一个询问, 2 2 2 前缀和 18 18 18 前缀分别是 zzzzaaccaazzccaacczz,由于 zz 只有一个 border ⁡ \operatorname{border} border,即 z,故最长公共 border ⁡ \operatorname{border} border 长度为 1 1 1


对于 16 % 16\% 16% 的数据, s s s 中的字符全部相等。

对于 100 % 100\% 100% 的数据, 1 ≤ p , q ≤ ∣ s ∣ ≤ 1 0 6 1\leq p,q \le |s|\leq 10^6 1p,qs106 1 ≤ m ≤ 1 0 5 1 \leq m \leq 10^5 1m105 s i ∈ [ a , z ] s_i \in [\texttt{a}, \texttt{z}] si[a,z]

失配树 KMP+树上倍增

s[0 ∼ \sim j]是s[0 ∼ \sim i]的最长公共前后缀,则节点j时节点i的父节点。则 i的任意祖先p,s[0 ∼ \sim p]都是s[0 ∼ \sim i]的公共前后缀。
节点m,n的公共前后缀,就是两者父节点的最近公共祖先。

代码

核心代码

#include <iostream>
#include <sstream>
#include <vector>
#include<map>
#include<unordered_map>
#include<set>
#include<unordered_set>
#include<string>
#include<algorithm>
#include<functional>
#include<queue>
#include <stack>
#include<iomanip>
#include<numeric>
#include <math.h>
#include <climits>
#include<assert.h>
#include<cstring>
#include<list>#include <bitset>
using namespace std;template<class T1, class T2>
std::istream& operator >> (std::istream& in, pair<T1, T2>& pr) {in >> pr.first >> pr.second;return in;
}template<class T1, class T2, class T3 >
std::istream& operator >> (std::istream& in, tuple<T1, T2, T3>& t) {in >> get<0>(t) >> get<1>(t) >> get<2>(t);return in;
}template<class T1, class T2, class T3, class T4 >
std::istream& operator >> (std::istream& in, tuple<T1, T2, T3, T4>& t) {in >> get<0>(t) >> get<1>(t) >> get<2>(t) >> get<3>(t);return in;
}template<class T = int>
vector<T> Read() {int n;scanf("%d", &n);vector<T> ret(n);for (int i = 0; i < n; i++) {cin >> ret[i];}return ret;
}template<class T = int>
vector<T> Read(int n) {vector<T> ret(n);for (int i = 0; i < n; i++) {cin >> ret[i];}return ret;
}template<int N = 1'000'000>
class COutBuff
{
public:COutBuff() {m_p = puffer;}template<class T>void write(T x) {int num[28], sp = 0;if (x < 0)*m_p++ = '-', x = -x;if (!x)*m_p++ = 48;while (x)num[++sp] = x % 10, x /= 10;while (sp)*m_p++ = num[sp--] + 48;AuotToFile();}void writestr(const char* sz) {strcpy(m_p, sz);m_p += strlen(sz);AuotToFile();}inline void write(char ch){*m_p++ = ch;AuotToFile();}inline void ToFile() {fwrite(puffer, 1, m_p - puffer, stdout);m_p = puffer;}~COutBuff() {ToFile();}
private:inline void AuotToFile() {if (m_p - puffer > N - 100) {ToFile();}}char  puffer[N], * m_p;
};template<int N = 1'000'000>
class CInBuff
{
public:inline CInBuff() {}inline CInBuff<N>& operator>>(char& ch) {FileToBuf();ch = *S++;return *this;}inline CInBuff<N>& operator>>(int& val) {FileToBuf();int x(0), f(0);while (!isdigit(*S))f |= (*S++ == '-');while (isdigit(*S))x = (x << 1) + (x << 3) + (*S++ ^ 48);val = f ? -x : x; S++;//忽略空格换行		return *this;}inline CInBuff& operator>>(long long& val) {FileToBuf();long long x(0); int f(0);while (!isdigit(*S))f |= (*S++ == '-');while (isdigit(*S))x = (x << 1) + (x << 3) + (*S++ ^ 48);val = f ? -x : x; S++;//忽略空格换行return *this;}template<class T1, class T2>inline CInBuff& operator>>(pair<T1, T2>& val) {*this >> val.first >> val.second;return *this;}template<class T1, class T2, class T3>inline CInBuff& operator>>(tuple<T1, T2, T3>& val) {*this >> get<0>(val) >> get<1>(val) >> get<2>(val);return *this;}template<class T1, class T2, class T3, class T4>inline CInBuff& operator>>(tuple<T1, T2, T3, T4>& val) {*this >> get<0>(val) >> get<1>(val) >> get<2>(val) >> get<3>(val);return *this;}template<class T = int>inline CInBuff& operator>>(vector<T>& val) {int n;*this >> n;val.resize(n);for (int i = 0; i < n; i++) {*this >> val[i];}return *this;}template<class T = int>vector<T> Read(int n) {vector<T> ret(n);for (int i = 0; i < n; i++) {*this >> ret[i];}return ret;}template<class T = int>vector<T> Read() {vector<T> ret;*this >> ret;return ret;}
private:inline void FileToBuf() {const int canRead = m_iWritePos - (S - buffer);if (canRead >= 100) { return; }if (m_bFinish) { return; }for (int i = 0; i < canRead; i++){buffer[i] = S[i];//memcpy出错			}m_iWritePos = canRead;buffer[m_iWritePos] = 0;S = buffer;int readCnt = fread(buffer + m_iWritePos, 1, N - m_iWritePos, stdin);if (readCnt <= 0) { m_bFinish = true; return; }m_iWritePos += readCnt;buffer[m_iWritePos] = 0;S = buffer;}int m_iWritePos = 0; bool m_bFinish = false;char buffer[N + 10], * S = buffer;
};class CBFSLeve {
public:static vector<int> Leve(const vector<vector<int>>& neiBo, vector<int> start) {vector<int> leves(neiBo.size(), -1);for (const auto& s : start) {leves[s] = 0;}for (int i = 0; i < start.size(); i++) {for (const auto& next : neiBo[start[i]]) {if (-1 != leves[next]) { continue; }leves[next] = leves[start[i]] + 1;start.emplace_back(next);}}return leves;}template<class NextFun>static vector<int> Leve(int N, NextFun nextFun, vector<int> start) {vector<int> leves(N, -1);for (const auto& s : start) {leves[s] = 0;}for (int i = 0; i < start.size(); i++) {auto nexts = nextFun(start[i]);for (const auto& next : nexts) {if (-1 != leves[next]) { continue; }leves[next] = leves[start[i]] + 1;start.emplace_back(next);}}return leves;}static vector<vector<int>> LeveNodes(const vector<int>& leves) {const int iMaxLeve = *max_element(leves.begin(), leves.end());vector<vector<int>> ret(iMaxLeve + 1);for (int i = 0; i < leves.size(); i++) {ret[leves[i]].emplace_back(i);}return ret;};static vector<int> LeveSort(const vector<int>& leves) {const int iMaxLeve = *max_element(leves.begin(), leves.end());vector<vector<int>> leveNodes(iMaxLeve + 1);for (int i = 0; i < leves.size(); i++) {leveNodes[leves[i]].emplace_back(i);}vector<int> ret;for (const auto& v : leveNodes) {ret.insert(ret.end(), v.begin(), v.end());}return ret;};
};class KMP
{
public:virtual int Find(const string& s, const string& t){CalLen(t);for (int i1 = 0, j = 0; i1 < s.length(); ){for (; (j < t.length()) && (i1 + j < s.length()) && (s[i1 + j] == t[j]); j++);//i2 = i1 + j 此时s[i1,i2)和t[0,j)相等 s[i2]和t[j]不存在或相等//t[0,j)的结尾索引是j-1,所以最长公共前缀为m_vLen[j-1],简写为y 则t[0,y)等于t[j-y,j)等于s[i2-y,i2)if (0 == j){i1++;continue;}const int i2 = i1 + j;j = m_vLen[j - 1];i1 = i2 - j;//i2不变}return -1;}//vector<int> m_vSameLen;//m_vSame[i]记录 s[i...]和t[0...]最长公共前缀,增加可调试性 部分m_vSameLen[i]会缺失//static vector<int> Next(const string& s)//{// j = vNext[i] 表示s[0,i]的最大公共前后缀是s[0,j]//	const int len = s.length();//	vector<int> vNext(len, -1);//	for (int i = 1; i < len; i++)//	{//		int next = vNext[i - 1];//		while ((-1 != next) && (s[next + 1] != s[i]))//		{//			next = vNext[next];//		}//		vNext[i] = next + (s[next + 1] == s[i]);//	}//	return vNext;//}const vector<int> CalLen(const string& str){m_vLen.resize(str.length());for (int i = 1; i < str.length(); i++){int next = m_vLen[i - 1];while (str[next] != str[i]){if (0 == next){break;}next = m_vLen[next - 1];}m_vLen[i] = next + (str[next] == str[i]);}return m_vLen;}
protected:int m_c;vector<int> m_vLen;//m_vLen[i] 表示str[0,i]的最长公共前后缀的长度
};class CParents
{
public:CParents(vector<int>& vParent, const int iMaxDepth){int iBitNum = 0;for (; (1 << iBitNum) < iMaxDepth; iBitNum++);const int n = vParent.size();m_vParents.assign(iBitNum + 1, vector<int>(n, -1));m_vParents[0] = vParent;//树上倍增for (int i = 1; i < m_vParents.size(); i++){for (int j = 0; j < n; j++){const int iPre = m_vParents[i - 1][j];if (-1 != iPre){m_vParents[i][j] = m_vParents[i - 1][iPre];}}}}int GetParent(int iNode, int iDepth)const{int iParent = iNode;for (int iBit = 0; iBit < m_vParents.size(); iBit++){if (-1 == iParent){return iParent;}if (iDepth & (1 << iBit)){iParent = m_vParents[iBit][iParent];}}return iParent;}inline int GetBitCnt()const { return m_vParents.size(); };inline const int& GetPow2Parent(int iNode, int n)const {return m_vParents[n][iNode];}//在leftNodeExclude的1到rightLeve级祖先中查找符合pr的最近祖先template<class _Pr>int FindFirst(int leftNodeExclude, int rightLeve, _Pr pr) {for (int iBit = GetBitCnt() - 1; iBit >= 0; iBit--) {const int iMask = 1 << iBit;if (!(iMask & rightLeve)) { continue; }if (pr(m_vParents[iBit][leftNodeExclude])) {return BFindFirst(leftNodeExclude, iBit, pr);}leftNodeExclude = m_vParents[iBit][leftNodeExclude];}return -1;}
protected://在leftNodeExclude的1到2^pow^级祖先中查找符合pr的最近祖先template<class _Pr>int BFindFirst(int leftNodeExclude, int pow, _Pr pr) {while (pow > 0) {const int& mid = m_vParents[pow - 1][leftNodeExclude];if (pr(mid)) {}else {leftNodeExclude = mid;}pow--;}return m_vParents[0][leftNodeExclude];}vector<vector<int>> m_vParents;
};template<long long MOD = 1000000007, class T1 = int, class T2 = long long>
class C1097Int
{
public:C1097Int(T1 iData = 0) :m_iData(iData% MOD){}C1097Int(T2 llData) :m_iData(llData% MOD) {}C1097Int  operator+(const C1097Int& o)const{return C1097Int(((T2)m_iData + o.m_iData) % MOD);}C1097Int& operator+=(const C1097Int& o){m_iData = ((T2)m_iData + o.m_iData) % MOD;return *this;}C1097Int& operator-=(const C1097Int& o){m_iData = ((T2)MOD + m_iData - o.m_iData) % MOD;return *this;}C1097Int  operator-(const C1097Int& o){return C1097Int(((T2)MOD + m_iData - o.m_iData) % MOD);}C1097Int  operator*(const C1097Int& o)const{return((T2)m_iData * o.m_iData) % MOD;}C1097Int& operator*=(const C1097Int& o){m_iData = ((T2)m_iData * o.m_iData) % MOD;return *this;}C1097Int  operator/(const C1097Int& o)const{return *this * o.PowNegative1();}C1097Int& operator/=(const C1097Int& o){*this /= o.PowNegative1();return *this;}bool operator==(const C1097Int& o)const{return m_iData == o.m_iData;}bool operator<(const C1097Int& o)const{return m_iData < o.m_iData;}C1097Int pow(T2 n)const{C1097Int iRet = (T1)1, iCur = *this;while (n){if (n & 1){iRet *= iCur;}iCur *= iCur;n >>= 1;}return iRet;}C1097Int PowNegative1()const{return pow(MOD - 2);}T1 ToInt()const{return ((T2)m_iData + MOD) % MOD;}
private:T1 m_iData = 0;;
};class C2Parents : public CParents
{
public:C2Parents(vector<int>& vParent, const vector<int>& vDepth) :m_vDepth(vDepth), CParents(vParent, *std::max_element(vDepth.begin(), vDepth.end())){}int GetPublicParent(int iNode1, int iNode2)const{int leve0 = m_vDepth[iNode1];int leve1 = m_vDepth[iNode2];if (leve0 < leve1){iNode2 = GetParent(iNode2, leve1 - leve0);leve1 = leve0;}else{iNode1 = GetParent(iNode1, leve0 - leve1);leve0 = leve1;}if (iNode1 == iNode2) { return iNode1; }for (int iBit = GetBitCnt() - 1; iBit >= 0; iBit--) {const int iMask = 1 << iBit;if (iMask & leve0) {const int i1 = GetPow2Parent(iNode1, iBit);const int i2 = GetPow2Parent(iNode2, iBit);if (i1 == i2) {while (iBit > 0) {const int i3 = GetPow2Parent(iNode1, iBit - 1);const int i4 = GetPow2Parent(iNode2, iBit - 1);if (i3 != i4) {iNode1 = i3; iNode2 = i4;}iBit--;}return GetPow2Parent(iNode1, 0);}else {iNode1 = i1; iNode2 = i2; leve0 -= iMask;}}}return iNode1;}
protected:vector<vector<int>> m_vParents;const vector<int> m_vDepth;
};//【失配树 树上倍增 KMP】P2375 [NOI2014] 动物园|省选-
class Solution {
public:vector<int> Ans(const string s, vector<pair<int, int>>& que) {const int N = s.length();auto next = KMP().CalLen(s);vector<int> par(N + 1, -1);vector<vector<int>> childs(N + 1);for (int i = 0; i < N; i++) {par[i + 1] = next[i];childs[next[i]].emplace_back(i + 1);}auto leves = CBFSLeve().Leve(childs, { 0 });C2Parents mulPar(par, leves);vector<int> ans;for (const auto& [p, q] : que) {const int p1 = par[p], q1 = par[q];ans.emplace_back(mulPar.GetPublicParent(p1, q1));}return ans;}
};int main() {
#ifdef _DEBUGfreopen("a.in", "r", stdin);
#endif // DEBUG	ios::sync_with_stdio(0);std::cin.tie(0);int m;string s;cin >> s >> m ;auto que = Read<pair<int, int>>(m);    
#ifdef _DEBUG		//printf("n=%d", n);//Out(que, "que=");//Out(ope, ",ope=");//Out(edge2, ",edge2=");/*Out(que, "que=");*/
#endif // DEBUG	auto res = Solution().Ans(s,que);for (auto& i : res){cout << i << "\n";}return 0;
}

单元测试

vector<pair<int, int>> que;TEST_METHOD(TestMethod1){que = { {2,4},{7,10},{3,4},{1,2},{4,11} };auto res = Solution().Ans("aaaabbabbaa",que);AssertEx({ 1,1,2,0,2 }, res);}TEST_METHOD(TestMethod2){que = { {2,18},{10,18},{3,5} };auto res = Solution().Ans("zzaaccaazzccaacczz", que);AssertEx({ 1,2,0 }, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

相关文章:

【失配树 KMP+树上倍增】P5829失配树|省选-

本文涉及知识点 较难理解的字符串查找算法KMP 树上倍增 P5829 【模板】失配树 题目描述 给定一个字符串 s s s&#xff0c;定义它的 k k k 前缀 p r e k \mathit{pre}_k prek​ 为字符串 s 1 … k s_{1\dots k} s1…k​&#xff0c; k k k 后缀 s u f k \mathit{suf}_…...

机器学习模型性能提升教程(特征工程和模型优化)

特征工程和模型优化是提升机器学习模型性能的核心步骤&#xff0c;以下从特征工程和模型优化两个维度&#xff0c;结合具体案例展开说明&#xff1a; 一、特征工程 特征工程的核心目标是从原始数据中提取更有价值的信息&#xff0c;常见方法包括特征选择、特征构造和特征转换。…...

跨域问题前端解决

由于浏览器的同源策略&#xff0c;前后端分离的项目&#xff0c;调试的时候总是会遇到跨域的问题&#xff0c;这里通过修改前端代码解决跨域问题。 首先先查看前端代码的根目录下&#xff0c;有没有vue.config.js文件, 若有&#xff0c;使用方法1&#xff0c;若没有此文件&…...

每天五分钟深度学习框架pytorch:搭建LSTM完成时间序列的预测

本文重点 前面一篇文章我们使用了pytorch搭建了循环神经网络LSTM然后完成了手写字体识别的任务,本文我们使用LSTM完成一个时间序列的任务。 数据集介绍 数据集如图所示,其中有一列是时间,然后还有一列是对应时间的起飞航班数,它可以看成是一个时间序列,通过前面t时间的起…...

Autosar应用层开发基础——Arxml制作

Davinci软件的主要作用 (1) AUTOSAR 软件架构设计 图形化建模&#xff1a;支持 SWC&#xff08;Software Component&#xff09;设计、接口定义、端口连接等。 分层架构管理&#xff1a;清晰划分 应用层&#xff08;SWC&#xff09; 和 基础软件层&#xff08;BSW&#xff09…...

Word 页眉设置(不同章节不同页眉)

需求分析 要给文档设置页眉&#xff0c;但是要不同的页眉不同的页眉 问题点&#xff1a;一旦设置页眉 每个页眉都是一样的 现在要设置不一样的 设置了页眉但是整个文章的页眉都一样 问题解决 取消链接 前一节&#xff08;不和前面的页眉同步更新&#xff09; 小结 不同的…...

Redis的Java客户端的使用

Redis 的 Java 客户端使用 C 追求极致的性能, 而 Java没有这样的追求. Redis 在官网公开了所使用的应用层协议 (RESP). 任何一个第三方都可以通过这个协议, 来实现出一个和 Redis 服务器通信的客户端程序. 已经有很多大佬, 做好了库, 可以让我们直接调用 (不必关注 RESP 协议…...

双向链表示例

#include <stdio.h> #include <stdlib.h>// 定义双向链表节点结构体 typedef struct list {int data; // 数据部分struct list *next; // 指向下一个节点的指针struct list *prev; // 指向前一个节点的指针 } list_t;// 初始化链表&#xff0c;将链表的…...

Unity如何把一个物体下物体复制很多到别的物体下

C# 脚本批量复制 如果需批量复制到多个父物体下&#xff0c;推荐用脚本实现&#xff1a; using UnityEngine;public class CopyChildren : MonoBehaviour {// 原父物体&#xff08;拖拽赋值&#xff09;public Transform sourceParent;// 目标父物体数组&#xff08;可拖拽多个…...

Java Properties 类详解

Java Properties 类详解 Properties 是 Java 中用于处理 键值对配置文件 的特殊类&#xff0c;继承自 Hashtable<Object,Object>。以下是其核心知识点&#xff1a; 1. 核心特性 特性说明存储格式纯文本文件&#xff08;.properties&#xff09;&#xff0c;每行 keyval…...

进程内存分布--之理论知识

一个由C/C编译的程序占用的内存分为以下几个部分 &#xff1a; 1、栈区&#xff08;stack&#xff09;&#xff1a;由编译器自动分配释放 &#xff0c;存放函数调用函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区&#xff08;heap&#xf…...

TDengine 窗口预聚集

简介 在大数据量场景下&#xff0c;经常需要查询某段时间内的汇总结果&#xff0c;当历史数据变多或者时间范围变大时&#xff0c;查询时间也会相应增加。通过预聚集的方式可以将计算结果提前存储下来&#xff0c;后续查询可以直接读取聚集结果&#xff0c;而不需要扫描原始数…...

高精度加法与乘法

原理就是模拟我们列竖式的过程。 一、加法 加法很简单&#xff0c;我们这里不再赘述 string solve(string s, string t) {string ans;int tmp 0;int n s.size()-1;int m t.size()-1;while(n>0||m>0||tmp){if(n>0){tmp s[n--]-0;}if(m>0){tmp t[m--]-0;}ans…...

macOS可视化桌面配置docker加速器

macOS可视化桌面配置docker加速器 在镜像settings->docker Engine改为国内镜像修改为国内镜像重启docker(可视化界面启动或者使用命令行)使用命令重启可视化界面重启 在镜像settings->docker Engine改为国内镜像 修改为国内镜像 {"registry-mirrors": ["…...

不用训练,集成多个大模型产生更优秀的输出

论文标题 Collab: Controlled Decoding using Mixture of Agents for LLM Alignment 论文地址 https://arxiv.org/pdf/2503.21720 作者背景 JP摩根&#xff0c;马里兰大学帕克分校&#xff0c;普林斯顿大学 动机 大模型对齐&#xff08;alignment&#xff09;的主要目的…...

【大模型】DeepSeek + 蓝耕MaaS平台 + 海螺AI生成高质量视频操作详解

目录 一、前言 二、蓝耘智能云MaaS平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 平台核心能力 三、海螺AI视频介绍 3.1 海螺AI视频是什么 3.2 海螺AI视频主要功能 3.3 海螺AI视频应用场景 3.4 海螺AI视频核心优势 3.5 项目git地址 四、蓝耘MaaS平台DeepSeek海…...

RobotFrameWork环境搭建及使用

RF环境搭建 首先安装python并且配置python环境变量pip install robotframeworkpip install robotframework-ride 生产桌面快捷方式 不行换豆瓣源检查一下pip list RF类库和扩展库 标准库 按F5快捷键查询&#xff0c;可以看到rf自带的库不需要额外安装这些标准库在python的 …...

Flutter之设计与主题字体

目录&#xff1a; 1、共享主题样式2、文字3、使用自定义字体4、以 package 的方式使用字体1. 将字体添加到 package2. 将 package 和字体添加到应用3. 使用字体 1、共享主题样式 MaterialApp(title: appName,theme: ThemeData(// Define the default brightness and colors.col…...

发生梯度消失, 梯度爆炸问题的原因,怎么解决?

目录 一、梯度消失的原因 二、梯度爆炸的原因 三、共同的结构性原因 四、解决办法 五、补充知识 一、梯度消失的原因 梯度消失指的是在反向传播过程中&#xff0c;梯度随着层数的增加指数级减小&#xff08;趋近于0&#xff09;&#xff0c;导致浅层网络的权重几乎无法更新…...

脑电学习笔记

一&#xff0c;原理简介 使用eprime或者matlab给被试呈现刺激&#xff0c;并在某个时间发送Mark&#xff0c;脑电帽会同步采集被试的脑电信号&#xff0c;经放大器放大后&#xff0c;控制盒会把脑电信号和mark 信号同步到一起&#xff0c;通过usb线传入到采集系统&#xff08;比…...

Java面试黄金宝典37

1. 转发与重定向的区别 定义 转发:服务器内部的一种请求处理方式,当客户端向服务器发送请求后,服务器将该请求转发到另一个资源(如 JSP、Servlet)进行处理,整个过程在服务器端完成,客户端并不知道请求被转发,且使用的是同一个请求对象和响应对象。重定向:服务器向客户…...

嵌入式rodata段

在嵌入式软件开发中&#xff0c;将数据放入只读数据段&#xff08;.rodata&#xff09;具有以下好处及典型应用示例&#xff1a; 好处 数据保护 .rodata段的内容在程序运行时不可修改&#xff0c;防止意外或恶意篡改&#xff0c;提升系统稳定性。 节省RAM资源 只读数据可直接…...

Python学习之numpy

Python学习之numpy 数组是Numpy库的核心数据结构。 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarr…...

ext4磁盘扩容

ext4扩容示例 当前虚机中&#xff0c;逻辑卷名称data_lv&#xff0c;卷组名称data_vg&#xff0c;物理卷名称data_pv&#xff0c;他们的大小都为100G&#xff0c;由于磁盘空间不够使用&#xff0c;申请扩容硬盘至200G&#xff0c;以下操作将ext4的/data分区扩容至200G。 # 1.…...

PostgreSQL 16深度解析(从16.0-16.8)

作为开源关系型数据库的标杆&#xff0c;PostgreSQL持续通过版本迭代展现其技术生命力。本文将以技术视角深度剖析PostgreSQL 16系列&#xff08;16.0至16.8&#xff09;的核心演进&#xff0c;重点解读新增功能、性能优化及实践价值&#xff0c;为数据库管理者与开发者提供升级…...

10个DeepSeek、ChatGPT提示词更快更好的学术文献阅读!

目录 AIGC助力快速阅读文献 10个文献阅读提示词 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ AIGC助力快速阅读文献 在当今学术界&#xff0c;海量的论文如潮水般涌来&#xff0c;想要跟上最新研究进展简直比在图书馆里找到一本没被借走的…...

基于spring boot 鲜花销售系统PPT(源码+lw+部署文档+讲解),源码可白嫖!

课题意义 随着网络不断的普及发展&#xff0c;鲜花销售系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的信息管理系统&#xff0c;利用目前网络给用户带来的方便快捷这一特点对系统进行调整&am…...

Spring Boot 与 TDengine 的深度集成实践(三)

创建 RESTful API 编写控制器类 在 Spring Boot 项目中&#xff0c;控制器类负责处理 HTTP 请求&#xff0c;并将请求转发到相应的服务或数据访问层进行处理&#xff0c;最后返回响应结果给客户端。我们通过使用RestController和RequestMapping注解来定义控制器类和 API 路由…...

物理日志和逻辑日志

在 MySQL 的日志系统中&#xff0c;物理日志 和 逻辑日志 是两种不同类型的日志记录方式&#xff0c;它们的设计目标和实现方式有本质区别。以下是它们的详细解释和对比&#xff1a; 1. 物理日志 定义 物理日志记录的是数据页&#xff08;Page&#xff09;的物理修改&#x…...

[Deep-ML]Reshape Matrix(重塑矩阵)

Reshape Matrix&#xff08;重塑矩阵&#xff09; 题目链接&#xff1a; Reshape Matrix&#xff08;重塑矩阵&#xff09;https://www.deep-ml.com/problems/3 题目描述&#xff1a; 难度&#xff1a; easy&#xff08;简单&#xff09;。 分类&#xff1a; Linear Alg…...

Linux文件系统中的Page Cache和内存管理中的Page之间的关系

Linux文件系统中的Page Cache和内存管理中的Page之间有密切的关联&#xff0c;两者在底层机制上紧密结合&#xff0c;共同实现高效的内存和文件系统管理。以下是它们的关系和关键点&#xff1a; 核心关系 Page Cache的底层是内存Page Page Cache是由内存管理中的物理内存页&…...

day25-回溯__491.递增子序列 __46.全排列__47.全排列 II

491.递增子序列 这道题要求输出一个数组的所有非递减子序列&#xff0c;并且数组中是可以存在重复元素的&#xff0c;那么我们需要考虑的就一定是之前的树层去重的方法 并且要求非递减&#xff0c;所以我们每次添加元素到path要先判断两个条件&#xff1a; 该元素的值是否在同…...

微型导轨的制造工艺中,热处理的目的是什么?

热处理是指将金属或合金加热到一定温度&#xff0c;保温一段时间&#xff0c;然后通过适当的冷却方式使其发生物理变化&#xff0c;从而使其性能发生改变的加工技术&#xff0c;而在微型导轨的制造工艺中&#xff0c;热处理是必须的&#xff0c;那么热处理的目的是什么呢&#…...

学透Spring Boot — 018. 优雅支持多种响应格式

这是我的专栏《学透Spring Boot》的第18篇文章&#xff0c;想要更系统的学习Spring Boot&#xff0c;请访问我的专栏&#xff1a;学透 Spring Boot_postnull咖啡的博客-CSDN博客。 目录 返回不同格式的响应 Spring Boot的内容协商 控制器不用任何修改 启动内容协商配置 访…...

数据结构与算法----顺序表和复杂度

嘻嘻&#xff0c;我们用c语言来手撕顺序表&#xff01;&#xff01;&#xff01;全程高能比喻代码实战&#xff0c;保证你笑着学会&#xff01;&#xff01;&#xff01; 引言 1、数据结构是计算机存储、组织数据的方式。算法是一系列计算步骤&#xff0c;用来将输入数据转化…...

Android studio局域网屏幕共享(旧手机可以用来当监控啦)

项目地址 https://github.com/Anyuersuper/ScreenSharing 百度网盘 通过网盘分享的文件&#xff1a;ScreenSharing-master.zip 链接: https://pan.baidu.com/s/1URQnyI8zJF-IFl5_-ttXBg?pwdyuer 提取码: yuer &#x1f4f1; 屏幕分享应用 (ScreenSharing) &#x1f4cb; 项目…...

Redis持久化之RDB

RDB持久化是将当前进程数据生成快照保存到硬盘的过程&#xff0c;触发RDB持久化过程分为手动触发和自动触发。 1.触发机制 手动触发费别对应save和bgsave命令&#xff1a; save命令&#xff1a;阻塞当前Redis服务器&#xff0c;直到RDB过程完成为止&#xff0c;对于内存比较…...

Ubuntu 64-bit 交叉编译 FFmpeg(高级用户指南)

适用于 ​​ARM (aarch64)、Windows (mingw)、Android、Raspberry Pi​​ 等平台的交叉编译。 ​​&#x1f539; 1. 安装交叉编译工具链​​ ​​ARM (aarch64) 示例​ sudo apt update sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu binutils-aarch64-linux…...

YOLO V8中的​“中心点邻近区域 + 动态IoU匹配“

它是联合优化正样本分配的策略&#xff0c;旨在更精准地匹配预测框与真实目标的位置关系。以下分步详解其原理&#xff1a; 1. 中心点邻近区域&#xff08;Central Region&#xff09;​​ ​​1.1 目标中心区域定义​​ ​​基础思想​​&#xff1a;将真实边界框&#xff…...

【MySQL | 八、 事务管理】

文章目录 什么是事务&#xff1f;事务的特性&#xff1a;事务的意义事务的提交查看事务提交方式事务的自动提交事务的手动提交开始事务执行SQL操作事务操作提交事务示例&#xff1a; 事务的隔离级别并发访问的基本概念并发事务的典型问题对ACID特性的影响查看和设置隔离属性各个…...

Ubuntu 下搭建 MCU 开发环境全流程指南(以 STM32 为例)

在嵌入式开发中,许多工程师都习惯于在 Windows 平台使用 Keil、IAR 等 IDE。然而,随着对自动化、可定制性以及开放工具链的需求增长,越来越多的开发者开始尝试在 Linux 环境下进行 MCU 开发。 本篇文章将以 STM32F1 系列 为例,手把手带你在 Ubuntu 下搭建一个完整的 MCU 开…...

Redis淘汰策略详解!

目录 一、为什么需要淘汰策略&#xff1f; &#x1f914;二、Redis 的淘汰策略详解 &#x1f447;三、如何选择合适的淘汰策略&#xff1f; &#x1f914;➡️✅四、如何切换 Redis 的淘汰策略&#xff1f; ⚙️&#x1f527;五、总结 &#x1f389; &#x1f31f;我的其他文章…...

基于51单片机和TM1638模块的小游戏《打地鼠》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、TM1638模块2、定时器03、定时器1 四、主函数总结 系列文章目录 前言 有两个版本&#xff0c;普中开发板版本和最小系统板版本&#xff0c;两个版本差别在于晶振频率不一样&#xff0c;其他的都相同。 本文代码…...

机器学习之数据预处理(一):缺失值处理和异常值识别的几种常用方法

始终致力于将复杂知识通俗化的不断追求中&#xff0c;不足之处欢迎批评指正。 1、噪声处理 噪声是一个测量变量中的随机错误或偏差&#xff0c;是观测值和真实值之间的误差&#xff0c;包括错误值或偏离期望的孤立点值。对于噪声的处理&#xff0c;通常可以采用数据平滑技术来…...

25/4/6 算法笔记<仿真O2DES>基础知识学习

此文章就来整理一下我学习到的O2DES仿真框架的一些核心知识 核心概念&#xff1a; 模拟器&#xff08;Simulator&#xff09;&#xff1a;模拟器是O2DES框架的核心组件&#xff0c;用来管理模拟时钟&#xff0c;事件调度和执行。可以通过Simulator类创建模拟环境&#…...

Three.js 系列专题 3:光照与阴影

内容概述 光照是 3D 场景真实感的关键。Three.js 提供了多种光源类型,每种光源有不同的效果和用途。本专题还将介绍如何启用和优化阴影效果,提升场景的深度感。 学习目标 理解不同光源类型及其应用场景。掌握在 Three.js 中添加光源并启用阴影。学会调整阴影效果以平衡真实…...

接口自动化学习五:mock工具使用

Moco简介&#xff1a; Mock是一个简单搭建模拟服务器的框架&#xff0c;可以用来模拟http、https、socket等协议。 原理&#xff1a; Mock会根据一些配置&#xff0c;启动一个真正的HTTP服务&#xff08;会监听本地的某个端口&#xff09;,当发起的请求满足某个条件时&#xf…...

Java学习——day22(Java反射基础入门)

文章目录 1.反射的定义2. 认识反射的关键API2.1 Class2.2 Field2.3 Method2.4 Constructor 3. 示例代码讲解与分析4. 编写反射示例代码的步骤4.1 定义测试类4.2 编写主程序&#xff0c;使用反射获取信息4.3 通过反射创建对象并调用方法 5. 总结6.今日生词 Java反射笔记 1.反射的…...

字符串、列表、元组、字典

字符串 双引号或者单引号中的数据&#xff0c;就是字符串 字符串输入 之前在学习input的时候&#xff0c;通过它能够完成从键盘获取数据&#xff0c;然后保存到指定的变量中&#xff1b; 注意&#xff1a;input获取的数据&#xff0c;都以字符串的方式进行保存&#xff0c;即…...

数据分析-Excel-学习笔记

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格个构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…...