后缀自动机(SAM)模板

 1 struct SAM{
 2     int ch[maxn][26],fa[maxn],len[maxn],cnt,last;
 3     void Init()
 4     {
 5         memset(ch,0,sizeof(ch));
 6         memset(fa,0,sizeof(fa));
 7         last=cnt=1;
 8     }
 9     void Add(int c)
10     {
11         int p=last,np=last=++cnt;
12         len[np]=len[p]+1;
13         while(!ch[p][c]&&p){
14             ch[p][c]=np;p=fa[p];
15         }
16         if(p==0)
17             fa[np]=1;
18         else{
19             int q=ch[p][c];
20             if(len[p]==len[q]-1){
21                 fa[np]=q;
22             }
23             else{
24                 int nq=++cnt;len[nq]=len[p]+1;
25                 memcpy(ch[nq],ch[q],sizeof(ch[q]));
26                 fa[nq]=fa[q];fa[q]=fa[np]=nq;
27                 while(ch[p][c]==q&&p){
28                     ch[p][c]=nq;
29                     p=fa[p];
30                 }
31             }
32         }
33     }
34 };

   然后是自整理最全SAM模版,超级大杀器!

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int N=200010;
 6 char s[N];
 7 int fa[N],pos[N],vis[N],sa[N],rank[N];
 8 int son[N][26],end[N],rht[N],lcp[N];
 9 int ch[N][26],len[N],id[N],tot;
10 int od[N],wv[N],lst,cnt;
11 
12 void Init(){
13     memset(ch,0,sizeof(ch));
14     memset(end,0,sizeof(end));
15     memset(son,0,sizeof(son));
16     memset(vis,0,sizeof(vis));
17     lst=cnt=1;tot=0;
18 }
19 
20 void Insert(int c){
21     int p=lst,np=lst=++cnt;end[lst]=1;
22     id[len[np]=len[p]+1]=np;rht[np]=1;
23     while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];
24     if(!p)fa[np]=1;
25     else{
26         int q=ch[p][c],nq;
27         if(len[q]==len[p]+1)fa[np]=q;
28         else{
29             len[nq=++cnt]=len[p]+1;
30             fa[nq]=fa[q];fa[q]=fa[np]=nq;
31             memcpy(ch[nq],ch[q],sizeof(ch[q]));
32             while(ch[p][c]==q)ch[p][c]=nq,p=fa[p];
33         }
34     }
35 }
36 
37 void Get_Right(){
38     for(int i=1;i<=cnt;i++)wv[len[i]]++;
39     for(int i=1;i<=cnt;i++)wv[i]+=wv[i-1];
40     for(int i=1;i<=cnt;i++)od[wv[len[i]]--]=i;
41     for(int i=cnt;i>=1;i--)rht[fa[od[i]]]+=rht[od[i]];
42 }
43 
44 void Build_Tree(){
45     int l=strlen(s+1);
46     for(int i=l;i>=1;i--)Insert(s[i]-'a');
47     for(int i=l;i>=1;i--)
48         for(int x=id[i],p=l+1;x&&!pos[x];x=fa[x])
49             p-=len[x]-len[fa[x]],pos[x]=p;
50     for(int x=2;x<=cnt;x++)son[fa[x]][s[pos[x]]-'a']=x;    
51 }
52 
53 void DFS(int x,int l){
54     if(end[x])sa[rank[l-len[x]+1]=++tot]=l-len[x]+1;
55     for(int i=0;i<26;i++)if(son[x][i])DFS(son[x][i],l);
56 }
57 
58 void Build_SA(){
59     int l=strlen(s+1),k=0;DFS(1,l);
60     for(int i=1,j;i<=l;lcp[rank[i++]]=k)
61         for(k?k--:k,j=sa[rank[i]-1];s[i+k]==s[j+k];k++);
62 }
63 
64 int main(){
65     //freopen();
66     //freopen();
67     Init();
68     scanf("%s",s+1);
69     int l=strlen(s+1);
70     Build_Tree();Build_SA();
71     for(int i=1;i<=l;i++)printf("%d ",sa[i]);printf("\n");
72     for(int i=2;i<=l;i++)printf("%d ",lcp[i]);printf("\n");
73     return 0;
74 }

   警告:这里的SAM都是naive-sam,无法跑trie和多串。

转载于:https://www.cnblogs.com/TenderRun/p/5208074.html

内容概要:本文档详细介绍了一个基于MATLAB实现的跨尺度注意力机制(CSA)结合Transformer编码器的多变量时间序列预测项目。项目旨在精准捕捉多尺度时间序列特征,提升多变量时间序列的预测性能,降低模型计算复杂度与训练时间,增强模型的解释性和可视化能力。通过跨尺度注意力机制,模型可以同时捕获局部细节和全局趋势,显著提升预测精度和泛化能力。文档还探讨了项目面临的挑战,如多尺度特征融合、多变量复杂依赖关系、计算资源瓶颈等问题,并提出了相应的解决方案。此外,项目模型架构包括跨尺度注意力机制模块、Transformer编码器层和输出预测层,文档最后提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,尤其是熟悉MATLAB和深度学习的科研人员、工程师和研究生。 使用场景及目标:①需要处理多变量、多尺度时间序列数据的研究和应用场景,如金融市场分析、气象预测、工业设备监控、交通流量预测等;②希望深入了解跨尺度注意力机制和Transformer编码器在时间序列预测中的应用;③希望通过MATLAB实现高效的多变量时间序列预测模型,提升预测精度和模型解释性。 其他说明:此项目不仅提供了一种新的技术路径来处理复杂的时间序列数据,还推动了多领域多变量时间序列应用的创新。文档中的代码示例和详细的模型描述有助于读者快速理解和复现该项目,促进学术和技术交流。建议读者在实践中结合自己的数据集进行调试和优化,以达到最佳的预测效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值