字符串~~~

article/2025/6/23 19:05:40

字符串~~

  • KMP
    • 例题
      • 1.无线传输
      • 2.删除字符串
      • 3.二叉树中的链表
  • AC自动机
  • Manacher
    • 例题
  • 扩展KMP
  • 字符串哈希


KMP

在这里插入图片描述

  • (1)
    在这里插入图片描述

  • (2)
    在这里插入图片描述

  • (3)
    在这里插入图片描述

  • 经典例题

    https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/

class Solution {
public:int n,m;int next[10002];//生成next数组void nextarr(string s2){next[0]=-1,next[1]=0;int i=2,cn=0;while(i<m){if(s2[i-1]==s2[cn])next[i++]=++cn;else if(cn>0)cn=next[cn];else next[i++]=0;}}//返回第一个匹配的下标int kmp(string s1,string s2){int x=0,y=0;while(x<n && y<m){if(s1[x]==s2[y]){x++,y++;}else if(y==0){x++;}else{y=next[y];}}return y==m ? x-y : -1;}int strStr(string s1, string s2) {n=s1.length(),m=s2.length();nextarr(s2);return kmp(s1,s2);}
};

若想求出所有匹配的位置,或数量,可以在s2后面加一个不可能匹配上的字符,然后当y==m时,说明匹配到了一个位置

例题

1.无线传输

https://www.luogu.com.cn/problem/P4391
一个神奇的结论,答案等于n-next[n],n为字符串长度

2.删除字符串


https://www.luogu.com.cn/problem/P4824
字符串拼接很费时间
用栈

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N (1000000+2)
struct node{int x;//s1中下标int y;//s2中与x相匹配的下标
}stack1[N];
int n,m;
string s,t;
int next1[N];
int top=-1;
//生成next数组
void nextarr(string s2){next1[0]=-1,next1[1]=0;int i=2,cn=0;while(i<m){if(s2[i-1]==s2[cn])next1[i++]=++cn;else if(cn>0)cn=next1[cn];else next1[i++]=0;}
}
//返回第一个匹配的下标
void kmp(string s1,string s2){int x=0,y=0;while(x<n){if(s1[x]==s2[y]){stack1[++top]={x,y};x++,y++;}else if(y==0){stack1[++top]={x,-1};x++;}else{y=next1[y];}if(y==m){top-=m;y= top!=-1 ? stack1[top].y + 1 : 0;}}
}
int main(){ cin>>s>>t;n=s.length();m=t.length();nextarr(t);kmp(s,t);//直接输出,不要用字符串拼接好再输出,会TLE!!!for(int i=0;i<=top;i++){cout<<s[stack1[i].x];}return 0;
}

3.二叉树中的链表


https://leetcode.cn/problems/linked-list-in-binary-tree/description/
用next数组加速

class Solution {
public:vector<int> s2;int next1[103];int m;void nextarr(vector<int> s2){next1[0]=-1,next1[1]=0;int i=2,cn=0;while(i<m){if(s2[i-1]==s2[cn])next1[i++]=++cn;else if(cn>0)cn=next1[cn];else next1[i++]=0;}}bool dfs(TreeNode* root,int y){if(y==m)return 1;1if(root==nullptr)return 0;while(y>=0 && root->val!=s2[y])y=next1[y];return dfs(root->left,y+1) || dfs(root->right,y+1);}bool isSubPath(ListNode* head, TreeNode* root) {while(head!=nullptr){s2.push_back(head->val);head=head->next;}m=s2.size();nextarr(s2);return dfs(root,0);}
};

AC自动机

作用:求出文章中指定字符串(多个)的词频

fail数组:当前路径的字符串s,与目标字符串们中的前缀匹配的最长后缀设为x,x的路径终点;

在这里插入图片描述
在这里插入图片描述

1.构造虚拟节点,直通表、在这里插入图片描述
洛谷5357

https://www.luogu.com.cn/problem/P5357

#include <bits/stdc++.h>
#define ll long long
#define N 200005
using namespace std;
int n;
int end1[N];//记录每个字符串终止的位置
int tree[N][30];//前缀树
int fail[N];
int ig[N];//出度
int times[N];
int cnt=0;
void insert(int x,string str){int cur=0;for(auto c:str){int d=c-'a';if(!tree[cur][d])tree[cur][d]=++cnt;cur=tree[cur][d];}         end1[x]=cur;
}
//设置fail指针以及设置直通表
void setFail(){int q[N],l=0,r=0;for(int i=0;i<=25;i++){if(tree[0][i]>0)q[r++]=tree[0][i];}while(l<r){int u=q[l++];for(int i=0;i<=25;i++){if(tree[u][i]==0)tree[u][i]=tree[fail[u]][i];else{fail[tree[u][i]]=tree[fail[u]][i];q[r++]=tree[u][i];ig[tree[fail[u]][i]]++;//出度++}}}
}
//建反图统计实际词频
void cp(){int q[N];int l=0,r=0;for(int i=1;i<=cnt;i++)if(ig[i]==0)q[r++]=i;while(l<r){int now=q[l++];times[fail[now]]+=times[now];if((--ig[fail[now]])==0)q[r++]=fail[now];}
}
void solve(){string s;cin>>n;for(int i=1;i<=n;i++){cin>>s;insert(i,s);}setFail();cin>>s;int cur=0;for(auto c:s){int d=c-'a';cur=tree[cur][d];times[cur]++;}cp();for(int i=1;i<=n;i++){cout<<times[end1[i]]<<'\n';}
}
int main(){ios::sync_with_stdio(0);cin.tie(0);solve();return 0;
}

如果不统计词频,而是判断是否存在敏感词,发现了马上停止
添加alert数组

void insert(int x,string str){int cur=0;for(auto c:str){int d=c-'0';if(!tree[cur][d])tree[cur][d]=++cnt;cur=tree[cur][d];}         alert[cur]=1;
}
//设置fail指针以及设置直通表
void setFail(){int q[N],l=0,r=0;for(int i=0;i<=9;i++){if(tree[0][i]>0)q[r++]=tree[0][i];}while(l<r){int u=q[l++];for(int i=0;i<=9;i++){if(tree[u][i]==0)tree[u][i]=tree[fail[u]][i];else{fail[tree[u][i]]=tree[fail[u]][i];q[r++]=tree[u][i];}}alert[u] |= alert[fail[u]];}
}

例题:洛谷3311

https://www.luogu.com.cn/problem/P3311
数位dp+AC自动机

#include <bits/stdc++.h>
#define ll long long
#define N 2005
using namespace std;
const ll mod=1e9+7;
int t;
int m;
int n;
// int end1[N];//记录每个字符串终止的位置
int tree[N][30];//前缀树
int fail[N];
int alert[N];
// int ig[N];//出度
// int times[N];
int cnt=0;
ll mem[N][N][2][2];
string s,s1;
void insert(int x,string str){int cur=0;for(auto c:str){int d=c-'0';if(!tree[cur][d])tree[cur][d]=++cnt;cur=tree[cur][d];}         alert[cur]=1;
}
//设置fail指针以及设置直通表
void setFail(){int q[N],l=0,r=0;for(int i=0;i<=9;i++){if(tree[0][i]>0)q[r++]=tree[0][i];}while(l<r){int u=q[l++];for(int i=0;i<=9;i++){if(tree[u][i]==0)tree[u][i]=tree[fail[u]][i];else{fail[tree[u][i]]=tree[fail[u]][i];q[r++]=tree[u][i];}}alert[u] |= alert[fail[u]];}
}
//f1:不用考虑大小f2:无前缀0
ll dfs(int x,int cur,int f1,int f2){if(alert[cur])return 0;if(x==n)return f2;if(~mem[x][cur][f1][f2])return mem[x][cur][f1][f2];ll ans=0;int mm=s1[x]-'0';if(f1){if(f2){for(int i=0;i<=9;i++){int next=tree[cur][i];ans=(ans+dfs(x+1,next,1,1))%mod;}}else{for(int i=1;i<=9;i++){int next=tree[cur][i];ans=(ans+dfs(x+1,next,1,1))%mod;}ans=(ans+dfs(x+1,0,1,0))%mod;}}else{if(f2){for(int i=0;i<mm;i++){int next=tree[cur][i];ans=(ans+dfs(x+1,next,1,1))%mod;}int next=tree[cur][mm];ans=(ans+dfs(x+1,next,0,1))%mod;}else{for(int i=1;i<mm;i++){int next=tree[cur][i];ans=(ans+dfs(x+1,next,1,1))%mod;}ans=(ans+dfs(x+1,0,1,0))%mod;int next=tree[cur][mm];ans=(ans+dfs(x+1,next,0,1))%mod;}}mem[x][cur][f1][f2]=ans;return ans;
}
void solve(){cin>>s1;cin>>m;memset(mem,-1,sizeof mem);n=s1.length();for(int i=1;i<=m;i++){cin>>s;insert(i,s);}setFail();cout<<dfs(0,0,0,0)%mod<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);solve();return 0;
}

Manacher

作用:求解最长回文子串
在这里插入图片描述

https://www.luogu.com.cn/problem/P3805

#include <bits/stdc++.h>
#define ll long long
#define N 23000000
using namespace std;
const ll mod=1e9+7;int p[N];char ss[N];int f(string s){int n=0;ss[n++]='#';for(auto &c:s){ss[n++]=c;ss[n++]='#';}return n;}int manacher(int n){int mx=0;for(int i=0,c=0,r=0,len;i<n;i++){len = r>i ? min(p[2*c-i],r-i) : 1;while(i+len<n && i-len>=0 && ss[i+len]==ss[i-len])len++;if(i+len>r)r=i+len,c=i;mx=max(mx,len);p[i]=len;}return mx-1;}
void solve(){string s;cin>>s;int n=f(s);cout<<manacher(n)<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);solve();return 0;
}

例题


https://www.luogu.com.cn/problem/P4555
在这里插入图片描述

#include <bits/stdc++.h>
#define ll long long
#define N 200004
using namespace std;
const ll mod=19930726;
int p[N];
char ss[N];
int left1[N];
int right1[N];
int f(string s){int n=0;ss[n++]='#';for(auto &c:s){ss[n++]=c;ss[n++]='#';}return n;
}
void manacher(int n){for(int i=0,c=0,r=0,len;i<n;i++){len = r>i ? min(p[2*c-i],r-i) : 1;while(i+len<n && i-len>=0 && ss[i+len]==ss[i-len]){len++;}if(i+len>r)r=i+len,c=i;p[i]=len;}
}
void solve() {string s;cin>>s;int n=f(s);manacher(n);for(int i=0,j=0;i<n;i++){while(i+p[i]>j){left1[j]=j-i;j+=2;}}for(int i=n-1,j=n-1;i>=0;i--){while(i-p[i]<j){right1[j]=i-j;j-=2;}}int ans=0;for(int i=2;i<n-2;i+=2){ans=max(ans,left1[i]+right1[i]);}cout<<ans<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);solve();return 0;
}

扩展KMP

求每个位置出发的字符串和原字符串(或另一个字符串)最大匹配前缀
z[N]


https://www.luogu.com.cn/problem/P5410
在这里插入图片描述

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
const int N=2e7+2;
int z[N];
int e[N];
string a,b;
void zkmp(string s){int n=s.length();z[0]=n;for(int i=1,c=0,r=0,len;i<n;i++){len = r>i ? min(z[i-c],r-i) : 0;while(i+len<n && s[i+len]==s[len])len++;if(i+len>r)r=i+len,c=i;z[i]=len;}
}
void ekmp(string s,string s2){int n=s.length(),n2=s2.length();for(int i=0,c=0,r=0,len;i<n;i++){len = r>i ? min(z[i-c],r-i) : 0;while(i+len<n && len<n2 && s[i+len]==s2[len])len++;if(i+len>r)r=i+len,c=i;e[i]=len;}
}
void solve(){cin>>a>>b;zkmp(b);ekmp(a,b);int an=a.length(),bn=b.length();ll ansz=0,anse=0;for(int i=0;i<bn;i++)ansz^=(ll)(i+1)*(z[i]+1);for(int i=0;i<an;i++)anse^=(ll)(i+1)*(e[i]+1);cout<<ansz<<'\n'<<anse<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);solve();return 0;
}

字符串哈希

在这里插入图片描述

https://www.luogu.com.cn/problem/P3370
在这里插入图片描述

#include <bits/stdc++.h>
#define ll unsigned long long
#define N 200004
using namespace std;
const ll mod=19930726;
const ll base=499;
int n;
//0->1,A->10,a->37
ll num[N];
ll f1(char x){if(x>='0' && x<='9')return x-'0'+1;if(x>='A' && x<='Z')return x-'A'+10;if(x>='a' && x<='z')return x-'a'+37;return 0;
}
ll f2(string s){ll ans=f1(s[0]);int n=s.length();for(int i=1;i<n;i++){ans=ans*base+f1(s[i]);}return ans;
}void solve() {cin>>n;string s;for(int i=1;i<=n;i++){cin>>s;num[i]=f2(s);}sort(num+1,num+n+1);int ans=1;for(int i=1;i<n;i++){if(num[i]!=num[i+1])ans++;}cout<<ans<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);solve();return 0;
}

在这里插入图片描述
例题:

https://leetcode.cn/problems/substring-with-concatenation-of-all-words/description/
在这里插入图片描述

class Solution {
public:int base=433;map<unsigned long long,int>my_map;map<unsigned long long,int>my_map1;unsigned long long pow[22000],hash[22000];void build(string &s,int n){pow[0]=1;for(int i=1;i<n;i++)pow[i]=pow[i-1]*base;hash[0]=s[0]-'a'+1;for(int i=1;i<n;i++)hash[i]=hash[i-1]*base+s[i]-'a'+1;}unsigned long long hs(int l,int r){unsigned long long ans=hash[r];ans-=(l==0 ? 0:(hash[l-1]*pow[r-l+1]));return ans;}unsigned long long f2(string &s){unsigned long long ans=s[0]-'a'+1;int n=s.length();for(int i=1;i<n;i++){ans=ans*base+s[i]-'a'+1;}return ans;}vector<int> findSubstring(string s, vector<string>& words) {vector<int> ans;int n=s.length();int len1=words[0].length();int len2=words.size();build(s,n);int cnt1=0,cnt;for(auto &ss:words){unsigned long long tmp=f2(ss);if(my_map1[tmp])my_map1[tmp]++;else my_map1[tmp]=1,cnt1++;}for(int k=0;k<len1;k++){cnt=cnt1;my_map=my_map1;for(int l=k,r=k;r<=n && l+len1<=n;){while(r+len1<=n && (r-l)/len1<len2){unsigned long long tmp=hs(r,r+len1-1);if(my_map.count(tmp)){if((--my_map[tmp])==0)cnt--;}r+=len1;}if(((r-l)/len1)==len2){if(cnt==0)ans.push_back(l);}unsigned long long tmp=hs(l,l+len1-1);if(my_map.count(tmp)){if((++my_map[tmp])==1)cnt++;}l+=len1;}}return ans;}
};


https://www.luogu.com.cn/problem/P3763
在这里插入图片描述
二分加字符串哈希;最差复杂度 n log ⁡ 4 n n{\log ^4}n nlog4n

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define N 100004
using namespace std;
const ll mod=19930726;
const ll base=499;
int t;
string s1,s2;
int n1,n2;
ull pow1[N],hash1[N],hash2[N]; 
inline ull zh(char c){return c-'A'+1;
}
inline void build(){pow1[0]=1;for(int i=1;i<=max(n1,n2);i++)pow1[i]=pow1[i-1]*base;hash1[0]=zh(s1[0]);for(int i=1;i<n1;i++)hash1[i]=hash1[i-1]*base+zh(s1[i]);hash2[0]=zh(s2[0]);for(int i=1;i<n2;i++)hash2[i]=hash2[i-1]*base+zh(s2[i]);
}
inline ull hs1(int l,int r){ull ans=hash1[r];ans-= l==0 ? 0 : (hash1[l-1]*pow1[r-l+1]);return ans;
}
inline ull hs2(int l,int r){ull ans=hash2[r];ans-= l==0 ? 0 : (hash2[l-1]*pow1[r-l+1]);return ans;
}
void solve(){cin>>s1>>s2;n1=s1.length();n2=s2.length();if(n1<n2){cout<<"0\n";return;}build();int ans=0;for(int l=0,r;l+n2-1<n1;l++){r=l+n2-1;int cnt=0;int now=l;int l1=now-l-1,r1=n2;while(cnt<=3 && now-l<n2){l1=now-l-1,r1=n2;while(l1+1<r1){int mid=(l1+r1)>>1;if(hs1(now,l+mid)==hs2(now-l,mid))l1=mid;else r1=mid;}if(l1==n2-1)break;cnt++;now=l+r1+1;}if(cnt<=3)ans++;}cout<<ans<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;while(t--){solve();}return 0;
}

http://www.hkcw.cn/article/pkkILHDQwC.shtml

相关文章

WEB3——简易NFT铸造平台之nft.storage

&#x1f9e0; 1. nft.storage 是什么&#xff1f; https://nft.storage 是 一个免费的去中心化存储平台&#xff0c;由 Filecoin 背后的 Protocol Labs 推出。 它的作用是&#xff1a; ✅ 接收用户上传的文件&#xff08;图片、JSON 等&#xff09; ✅ 把它们永久存储到 IPFS…

MCP架构全解析:从核心原理到企业级实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

注销微软账户

若你需要注销微软账号&#xff0c;请点击下方超链接。 点击此处

华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《生成…

Python实现P-PSO优化算法优化BP神经网络分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能技术的快速发展&#xff0c;神经网络在分类任务中展现了强大的性能。BP&#xff08;Back Propagation&…

学习海康VisionMaster之表面缺陷滤波

一&#xff1a;进一步学习了 今天学习下VisionMaster中的表面缺陷滤波&#xff1a;简单、无纹理背景的表面缺陷检测&#xff0c;可以检测表面的异物&#xff0c;缺陷&#xff0c;划伤等 二&#xff1a;开始学习 1&#xff1a;什么表面缺陷滤波&#xff1f; 表面缺陷滤波的核心…

34.x64汇编写法(一)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;33.第二阶段x64游戏实战-InLineHook 首先打开 Visual Studio&#xff0c;然后创…

Java网络编程实战:TCP/UDP Socket通信详解与高并发服务器设计

&#x1f50d; 开发者资源导航 &#x1f50d;&#x1f3f7;️ 博客主页&#xff1a; 个人主页&#x1f4da; 专栏订阅&#xff1a; JavaEE全栈专栏 内容&#xff1a; socket(套接字)TCP和UDP差别UDP编程方法使用简单服务器实现 TCP编程方法Socket和ServerSocket之间的关系使用简…

算法:滑动窗口

1.长度最小的子数组 209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 运用滑动窗口&#xff08;同向双指针&#xff09;来解决&#xff0c;因为这些数字全是正整数&#xff0c;在left位置确定的下&#xff0c;right这个总sum会越大&#xff0c;所以我们先让num…

AI笔记 - 网络模型 - mobileNet

网络模型 mobileNet mobileNet V1网络结构深度可分离卷积空间可分![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/aff06377feac40b787cfc882be7c6e5d.png) 参考 mobileNet V1 网络结构 MobileNetV1可以理解为VGG中的标准卷积层换成深度可分离卷积 可分离卷积主要有…

新中地三维GIS开发智慧城市效果和应用场景

近年来&#xff0c;随着科技的发展和城市化进程的加速&#xff0c;智慧城市成为了全球各大城市的一个重要发展方向。 在这一背景下&#xff0c;三维GIS技术以其独特的优势&#xff0c;成为构建智慧城市不可或缺的工具。新中地GIS开发特训营正是在这样的大环境下应运而生&#…

Linux笔记---线程

1. 线程的介绍 1.1 线程的概念 基本定义&#xff1a; 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程&#xff08;Process&#xff09;之中&#xff08;或者说是进程的一部分、对进程的划分&#xff09;&#xff0c;是进程中的实际…

Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)

前言&#xff1a;ArrayList是Java中最常用的动态数组实现之一&#xff0c;它提供了便捷的操作接口和灵活的扩展能力&#xff0c;使得在处理动态数据集合时非常方便。本文将深入探讨Java中ArrayList的实现原理、常用操作以及一些使用场景。 一&#xff1a;体系结构 二&#xff…

antddesign使用iconfont的字体库和图标库

antddesign使用iconfont 使用iconfont自定义字体 1️⃣选择一种需要的字体&#xff0c;点击【字体包下载】&#xff1a; 2️⃣下载好的字体放到项目目录下&#xff1a;src/assets/fonts&#xff1a; 3️⃣新建styles/font.css文件&#xff1a; /* src/styles/fonts.css */ f…

LearnOpenGL-笔记-其十二

今天我们来将LearnOpenGL的高级光照部分彻底完结&#xff1a; Bloom 泛光是一个非常常见的用于改善图像质量的手段&#xff0c;其主要做法就是将某个高亮度区域的亮度向四周发善以实现该区域更亮的视觉效果&#xff08;因为显示器的亮度范围有限&#xff0c;需要通过泛光来体…

第十二节:第一部分:集合框架:概述、Collection集合的常用方法

集合体系结构 Collection集合体系 Collection的常用方法 代码&#xff1a; 代码一&#xff1a;认识Collection体系的特点 package com.itheima.day17_Collection;import java.util.ArrayList; import java.util.HashSet;/* * 目标:认识Collection体系的特点。 * */ public cl…

C++哈希表:unordered系列容器详解

本节目标 1.unordered系列关联式容器 2.底层结构 3.模拟实现 4.哈希的应用 5.海量数据处理面试题 unordered系列关联式容器 在c98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可以达到logN&#xff0c;即最差的情况下需要比较红…

非常有趣的桌面萌宠互动软件

软件介绍 这里要介绍的软件是一款在主播直播领域十分实用的萌系插件&#xff0c;它能让主播的直播更具趣味性和吸引力。 软件开发者与特性 该软件由国外高中生kuroni开发&#xff0c;是一款开源软件。其最大的亮点在于&#xff0c;能让手鼓猫的手臂跟随鼠标和按键操作做出相…

InfluxQL 数据分析实战:聚合、过滤与关联查询全解析

InfluxQL 作为时序数据库的专用查询语言&#xff0c;在处理时间序列数据时展现出独特优势。本文深入探讨 聚合计算、数据过滤和跨测量关联 三大核心操作&#xff0c;通过真实代码示例展示如何从海量时序数据中提取关键洞察。文中涵盖从基础平均值计算到复杂多维度分析的完整流程…

记一次idea中lombok无法使用的解决方案

在注解处理器下&#xff0c;一般 Default 为“启用注解处理”和“从项目类路径获取处理器”&#xff0c;但是我的项目中的为选择“处理器路径”&#xff0c;导致了无法识别lombok&#xff0c;因此&#xff0c;需要改为使用“从项目类路径获取处理器”这个选项。如下图所示&…