亿些模板【字符串+其他】

文章目录

    • 前言
  • 其他
  • 字符串模板
    • KMP
    • 字符串hash
    • Trie
    • 最小表示法
    • Manacher
    • AC自动机
    • SA
    • SAM
    • 广义SAM
    • PAM
  • 其他模板
    • 凸包
    • 模拟退火

前言

因为老是懒得打模板的时候老是扣不到自己的标(因为之前的都打得太丑了),所以导致我十分的不爽。便打算开一个模板库。会不断更新的


其他

快读快输

int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}
void print(int x){if (x>9) print(x/10); putchar(x%10+48); return;
}

卡常

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")

DataMakerDataMakerDataMaker

#include<cstdlib>
#include<string>
#include<ctime>
#include<iostream>
using namespace std;
int t;
string s;
int random(int x)
{return 1+(long long)rand()*rand()*rand()*rand()%x;}
int main()
{srand((unsigned long long)time(0));scanf("%d",&t);for(int ti=1;ti<=t;ti++){s="data";if (ti>=10) s+=ti/10+48;s+=ti%10+48;s+=".in";freopen(s.c_str(),"w",stdout);fclose(stdout);}
}

字符串模板

KMP

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e6+7;
int next[maxn];
char s2[maxn],s1[maxn];
void spawn_next(char* st)
{int l=strlen(st),k=0;next[0]=-1;for(int i=0; i<l; i++){k=next[i];while(k!=-1&&st[i]!=st[k]) k=next[k];next[i+1]=++k;}
}
int match(char* st,char* s)
{int l1=strlen(st),l2=strlen(s);int k=0;for(int i=0; i<l1; i++){while(k!=-1&&st[i]!=s[k]) k=next[k];if(st[i]==s[k]) k++;if(k==l2) return i-l2+1;}
}
int kmp(char* st,char* s)
{spawn_next(st); return match(st,s);
}
int main()
{scanf("%s%s",s1,s2);int ass=kmp(s1,s2)+1;printf("%d",ass);
}

字符串hash

#include<cstdio>
#include<iostream>
#include<string>
#define p 30001
using namespace std;
int n,ans;
string s,hash[p];
int hashmath(string x)
{int ans=0;for (int i=0;i<x.size();i++){ans=(ans+x[i])%p;}return ans%p;
}
int locate(string x)
{int wz=hashmath(x);int i=0;while (i<p && hash[(wz+i)%p]!=x && hash[(wz+i)%p]!="")i++;return (wz+i)%p;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){cin>>s;int wz=locate(s);if(hash[wz]!=s){hash[wz]=s;ans++;}}printf("%d",ans);
}

Trie

#include<cstdio>
#include<cstring>
using namespace std;
int n,tot,m,l[800000][26];;
char s[101];
bool pre[800000],ok[800000];
void insert(char *s)//插入
{int len=strlen(s),now=0;for(int i=0;i<len;i++){int ch=s[i]-'a';if(!l[now][ch]) l[now][ch]=++tot;//新建节点now=l[now][ch];//下一个点}pre[now]=true;return;
}
void find(char *s)
{int len=strlen(s),now=0;for(int i=0;i<len;i++){int ch=s[i]-'a';if(!l[now][ch])//错误匹配{printf("WRONG\n");return;}now=l[now][ch];}if(!pre[now]) printf("WRONG\n");//错误匹配else if(ok[now]) printf("REPEAT\n");//重复匹配else {printf("OK\n");ok[now]=true;}//正确匹配和标记return;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",s);insert(s);}scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%s",s);find(s);}return 0;
}

最小表示法

#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[600010],ans;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i+n]=a[i];int i=1,j=2,k;while(i<=n&&j<=n){for(k=0;k<=n&&a[i+k]==a[j+k];k++);//找不同if(k==n) break;//全一个if(a[i+k]>a[j+k]){i=i+k+1;if(i==j) i++;}else{j=j+k+1;if(i==j) j++;}}ans=min(i,j);//取最小for(i=ans;i<ans+n;i++)printf("%d ",a[i]);//输个出
}

Manacher

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=11100000;
int n,ans,hw[2*N];
char re[N],s[2*N];
void Manacher()
{int mid=0,maxright=0;for(int i=1;i<=n;i++){if(i<=maxright)hw[i]=min(hw[2*mid-i],hw[mid]+mid-i);else hw[i]=1;while(s[i-hw[i]]==s[i+hw[i]]) hw[i]++;if(i+hw[i]>maxright){maxright=i+hw[i];mid=i;}ans=max(ans,hw[i]);}
}
int main()
{scanf("%s",re+1);n=strlen(re+1);s[0]=s[1]='#';for(int i=1;i<=n;i++){s[i*2]=re[i];s[i*2+1]='#';}n=n*2+2;s[n]=0;Manacher();printf("%d",ans-1);
}

AC自动机

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e6+100;
int n,ans;
char s[N];
struct ACmac{int fail[N],son[N][30],siz[N],cnt;queue<int> q;void Make(char *s){int x=1,len=strlen(s);for(int i=0;i<len;i++){int c=s[i]-'a';if(!son[x][c]){son[x][c]=++cnt;memset(son[cnt],0,sizeof(son[cnt]));}x=son[x][c];}siz[x]++;return;}void Bfs(){for(int i=0;i<26;i++)son[0][i]=1;q.push(1);fail[1]=0;while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<26;i++){if(!son[x][i]) son[x][i]=son[fail[x]][i];else{q.push(son[x][i]);int y=fail[x];fail[son[x][i]]=son[y][i];}}}}void Find(char *s){int x=1,len=strlen(s);for(int i=0;i<len;i++){int c=s[i]-'a',k=son[x][c];while(k>1&&siz[k]){ans+=siz[k];siz[k]=0;k=fail[k];}x=son[x][c];}return;}
}Ac;
int main()
{scanf("%d",&n);Ac.cnt=1;for(int i=0;i<26;i++)Ac.son[0][i]=1,Ac.son[1][i]=0;for(int i=1;i<=n;i++){scanf("%s",s);Ac.Make(s);}Ac.Bfs();scanf("%s",s);Ac.Find(s);printf("%d\n",ans);
}

SA

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int n,m,sa[N],x[N],y[N],c[N];
char s[N];
void Qsort(){//基数排序for(int i=1;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;
}
void Get_SA(char *s)
{for(int i=1;i<=n;i++)//将第一位获取位第一关键字x[i]=s[i]-'0'+1,y[i]=i;Qsort();for(int w=1;w<=n;w<<=1){int p=0;for(int i=n-w+1;i<=n;i++)y[++p]=i;//将2*w位后已经没有的先丢到前面for(int i=1;i<=n;i++)//每个对应到其i-w的第二关键字if(sa[i]>w) y[++p]=sa[i]-w;Qsort();swap(x,y);//排序x[sa[1]]=p=1;for(int i=2;i<=n;i++)//确定新的排名并判断排序是否结束x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+w]==y[sa[i-1]+w])?p:++p;if(p==n) break;m=p;}return;
}
int main()
{scanf("%s",s+1);n=strlen(s+1);m=100;Get_SA(s);for(int i=1;i<=n;i++)printf("%d ",sa[i]);return 0;
}

SAM

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e6+10;
int n,cnt,num[N],len[N],fail[N],next[N][26],ans;
char s[N];
void New_Point(int x,int y){next[x][y]=++cnt;len[cnt]=len[x]+1;
}
void Make_SAM(char *s){int last;cnt=last=num[1]=1;for(int i=1;i<=n;i++){int val=s[i]-'a';New_Point(last,val);int x=last,y;last=next[x][val];for(y=fail[x];y;y=fail[y])if(!next[y][val]) next[y][val]=last;else{if(len[y]+1==len[next[y][val]])fail[last]=next[y][val];else{int z=next[y][val];New_Point(y,val);fail[cnt]=fail[z];num[cnt]=num[z];fail[last]=fail[z]=cnt;for(int i=0;i<26;i++)next[cnt][i]=next[z][i];for(int w=y;w;w=fail[w])if(next[w][val]==z)next[w][val]=cnt;}break;}if(!y)fail[last]=1;for(y=last;y;y=fail[y])num[y]++;}return;
}
int main()
{scanf("%s",s+1);n=strlen(s+1);Make_SAM(s);for(int i=1;i<=cnt;i++)if(num[i]>1)ans=max(ans,num[i]*len[i]);printf("%d",ans);
}

广义SAM

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e6+10;
ll n,m,cnt,last,len[N],fa[N],ch[N][26],ans;
char s[N];
ll Ins(ll c,ll last){ll p=last;if(ch[p][c]){ll q=ch[p][c];if(len[p]+1==len[q])return q;else{ll nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[q]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;return nq;}}ll np=++cnt;len[np]=len[p]+1;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1;else{ll q=ch[p][c];if(len[p]+1==len[q])fa[np]=q;else{ll nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[q]=fa[np]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}return np;
}
int main()
{scanf("%lld",&m);cnt=1;for(ll i=1;i<=m;i++){last=1;scanf("%s",s);n=strlen(s);for(ll j=0;j<n;j++)last=Ins(s[j]-'a',last);}for(ll i=1;i<=cnt;i++)ans+=len[i]-len[fa[i]];printf("%lld",ans);
}

PAM

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e6+10;
int n,len[N],fail[N],num[N],next[N][26],cnt,m,last;
char s[N];
int get_fail(int x){for(;s[n-len[x]-1]!=s[n];)x=fail[x];return x; 
}
int Insert(){int x=get_fail(last);if(!next[x][s[n]]){len[++cnt]=len[x]+2;int y=get_fail(fail[x]);fail[cnt]=next[y][s[n]];num[cnt]=num[fail[cnt]]+1;next[x][s[n]]=cnt;}return (last=next[x][s[n]]);
}
int main()
{scanf("%s",s+1);m=strlen(s+1);s[0]=26;len[1]=-1;fail[0]=cnt=1;int k=0;for(n=1;n<=m;n++){s[n]=(s[n]-'a'+k)%26;printf("%d ",k=num[Insert()]);}
}

其他模板

凸包

#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 10010
using namespace std;
struct point{double x,y;
}a[N];
int n,s[N];
double ans;
double m(point x,point y,point z)
{return (x.x-z.x)*(y.y-z.y)-(y.x-z.x)*(x.y-z.y);}
double dis(point x,point y)
{return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));}
bool cmp(point x,point y)
{double t=m(x,y,a[1]);if(t>0||t==0&&dis(x,a[1])<dis(y,a[1]))return true;else return false;
}
void init()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf%lf",&a[i].x,&a[i].y);if(a[i].y<a[1].y||a[i].y==a[1].y&&a[i].x<a[1].x)swap(a[i],a[1]);}sort(a+2,a+1+n,cmp);
}
void praham()
{s[1]=1;s[2]=2;s[3]=3;int top=3;for(int i=4;i<=n;i++){while(m(a[i],a[s[top]],a[s[top-1]])>=0)top--;s[++top]=i;}for(int i=1;i<top;i++)ans+=dis(a[s[i]],a[s[i+1]]);printf("%.2lf",ans+dis(a[s[1]],a[s[top]]));
}
int main()
{init();praham();
}

模拟退火

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int N=1100;
const double Delit=0.993;
int n;double x[N],y[N],v[N],ansx,ansy,ans;
double calc(double nx,double ny){double ans=0;for(int i=1;i<=n;i++){double zx=x[i]-nx,zy=y[i]-ny;ans+=sqrt(zx*zx+zy*zy)*v[i];}return ans;
}
void S_A(){double x=ansx,y=ansy;double t=2000;while(t>1e-14){double nx=x+((rand()<<1)-RAND_MAX)*t;double ny=y+((rand()<<1)-RAND_MAX)*t;double now=calc(nx,ny),k=now-ans;		double now=calc(nx,ny),k=now-ans;printf("%d %lf %lf %lf\n",rand(),nx,ny,now);break;if(k<0){ans=now;x=nx;y=ny;ansx=nx;ansy=ny;}else if(exp(-k/t)*RAND_MAX>rand())x=nx,y=ny;t=t*Delit;}return;
}
void Solve(){ansx/=n;ansy/=n;ans=calc(ansx,ansy);S_A();S_A();S_A();return;
}
int main()
{srand(19260817);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf%lf%lf",&x[i],&y[i],&v[i]);ansx+=x[i];ansy+=y[i];}Solve();printf("%.3lf %.3lf",ansx,ansy);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Identity Server 4建立Authorization Server (6) - js(angular5) 客户端

预备知识: 学习Identity Server 4的预备知识 第一部分: 使用Identity Server 4建立Authorization Server (1) 第二部分: 使用Identity Server 4建立Authorization Server (2) 第三部分: 使用Identity Server 4建立Authorization Server (3) 第四部分: 使用Identity Server 4建立…

SpringBoot整合kafka(实现producer和consumer)

转载自 SpringBoot整合kafka(实现producer和consumer) 在Windows环境下安装运行Kafka&#xff1a;https://www.jianshu.com/p/d64798e81f3b 本文代码使用的是Spring Boot 2.1.1.RELEASE 版本 <parent><groupId>org.springframework.boot</groupId><art…

js的字符串和变量拼接

使用反引号拼接字符串和变量 let count 1 name 用户${count} console.log(name);注意是反引号不是引号&#xff0c;反引号是Esc下面的一个按键

ASP.NET Core 认证与授权[7]:动态授权

基于资源的授权 有些场景下&#xff0c;授权需要依赖于要访问的资源&#xff0c;例如&#xff1a;每个资源通常会有一个创建者属性&#xff0c;我们只允许该资源的创建者才可以对其进行编辑&#xff0c;删除等操作&#xff0c;这就无法通过[Authorize]特性来指定授权了。因为授…

maven中scope属性的

转载自 maven中scope属性的 Dependency Scope 在POM 4中&#xff0c;<dependency>中还引入了<scope>&#xff0c;它主要管理依赖的部署。目前<scope>可以使用5个值&#xff1a; * compile&#xff0c;缺省值&#xff0c;适用于所有阶段&#xff0c;会随着…

P3384-[模板]树链剖分

正题 题目大意 要求支持路径加和求和&#xff0c;子树加和求和 解题思路 树剖不解释 codecodecode #include<cstdio> #include<algorithm> using namespace std; const int N200000; int tot,cnt,n,m,s,p,ls[N],pw[N],id[N]; int siz[N],dep[N],f[N],son[N],seg…

H5的Websocket基本使用

前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

springboot手动提交kafka offset

转载自 springboot手动提交kafka offset enable.auto.commit参数设置成了false 但是测试发现enable.auto.commit参数设置成了false&#xff0c;kafka的offset依然提交了&#xff08;也没有进行人工提交offset&#xff09;。 查看源码 如果我们enable.auto.commit设置为false…

P2114-[NOI2014]起床困难综合症【位运算】

正题 题目大意 若干个位操作&#xff0c;求一个值xxx使得进行了以后的最大值。 解题思路 每位分开运算计算出每一位为0和为1时的结果&#xff0c;然后贪心选择。 codecodecode // luogu-judger-enable-o2 #include<cstdio> using namespace std; int n,m,ans,t; char …

可观测性与原生云监控

在近日发表的一篇文章中&#xff0c;Cindy Sridharan概括介绍了可观测性及其与原生云应用程序监控的关系。可观测性是一种理念&#xff0c;包括监控、日志聚合、指标和分布式跟踪&#xff0c;可以实时更深入地观察系统。 Sridharan的文章基于她就同一个主题所做的Velocity演讲。…

项目总览地址

写这篇的目的是整理一下最近一段时间写的小demo&#xff0c;我这里稍微自夸一下暂且先叫项目吧&#xff0c;如果服务器不垮台的话&#xff0c;以后还是一直可以看到预览效果的&#xff0c;反正域名和服务器我是不会扔掉的&#xff0c;就怕后面项目多了&#xff0c;服务器承受不…

mybatis3中@SelectProvider的使用技巧

转载自 mybatis3中SelectProvider的使用技巧 mybatis3中增加了使用注解来配置Mapper的新特性&#xff0c;本篇文章主要介绍其中几个Provider的使用方式&#xff0c;他们是&#xff1a;SelectProvider、UpdateProvider、InsertProvider和DeleteProvider。MyBatis 3 User Guide中…

P2766-最长不下降子序列问题【网络流,dp】

正题 题目大意 求最长不下降子序列和可以取出多少以及允许多次使用一些数时可以取出多少个。 解题思路 第一问dp求&#xff0c;且保存以xxx开头的最长长度fxf_xfx​。 第二问考虑网络流。 我们对于每个数字以fif_ifi​的不同分层&#xff0c;然后每次从下往上一层连接&#x…

使用Microsoft.AspNetCore.TestHost进行完整的功能测试

简介 Microsoft.AspNetCore.TestHost是可以用于Asp.net Core 的功能测试工具。很多时候我们一个接口写好了&#xff0c;单元测试什么的也都ok了&#xff0c;需要完整调试一下&#xff0c;检查下单元测试未覆盖到的代码是否有bug。步骤为如下&#xff1a;程序打个断点->F5运行…

MockJs案例

有时候前端写好模板后&#xff0c;后端还完工&#xff0c;那么总不能一直让项目停滞吧&#xff0c;这里就用Mockjs来模拟后端接口的数据&#xff0c;让我们先人一步完成项目。 首先创建一个html&#xff0c;导入axios和mockjs 再用mock去拦截请求&#xff0c;如果后端接口写好了…

JS document.execCommand实现复制功能

转载自 JS document.execCommand实现复制功能 最近项目中需要实现功能&#xff1a;点击button&#xff0c;复制input框的值&#xff1b; 我使用的是 document.execCommand(copy)的方法&#xff1b; 但是很郁闷的是&#xff0c;始终实现不了功能&#xff1b;代码如下 HTML代…

Entity Framework Core 使用HiLo生成主键

HiLo是在NHibernate中生成主键的一种方式&#xff0c;不过现在我们可以在Entity Framework Core中使用。所以在这篇内容中&#xff0c;我将向您在介绍如何在Entity Framework Core中使用HiLo生成主键。 什么是Hilo&#xff1f; HiLo是High Low的简写&#xff0c;翻译成中文叫高…

P1991-无线通讯网【最小生成树,瓶颈生成树】

正题 题目大意 有nnn个点&#xff0c;连边长度不超过DDD的情况下分为SSS个联通块。 求最小的DDD 解题思路 直接KruskalKruskalKruskal连边连到只剩下SSS个联通块就好了。 codecodecode #include<cstdio> #include<cmath> #include<algorithm> using names…

Echarts报错:Component series.lines not exists. Load it first.

前几天用的echarts标签是bootcdn的 <script src"https://cdn.bootcdn.net/ajax/libs/echarts/4.7.0/echarts-en.common.js"></script>用着官方给的案例还可以&#xff0c;但是一用gallery社区里面的例子就报错 后来经过不断调试终于知道是需要换个cdn&…

Mongodb常见问题

转载自 Mongodb常见问题 一.数据库级锁 MongoDB的锁机制和一般关系数据库如 MySQL&#xff08;InnoDB&#xff09;, Oracle 有很大的差异&#xff0c;InnoDB 和 Oracle 能提供行级粒度锁&#xff0c;而 MongoDB 2.x 只能提供 库级粒度锁&#xff0c;这意味着当 MongoDB 一个…