SAM是处理单个字符串的首选算法,若是多个字符串但是又符合SAM出题的题型,考虑广义SAM

1.伪广义SAM

大概有两种做法

1.在各个字符串中间加上一些奇怪的字符(或者让last变成初始点),然后按照普通SAM做即可

2.对一个字符串构建SAM(一般选最短的),然后用其他的字符串去在这个SAM上跑,打上标记后经过一系列操作去得到正确答案

[HAOI2016]找相同字符

并没有想到用广义SAM怎么做

考了对一个串建立SAM

对于另一个串,在SAM上跑,维护当前最长子串,因为相当于长度为1~最长子串所有后缀都出现过一次

每经过一个点,先加上最长子串-此节点最短子串的个数,然后在他的parent tree的父亲节点打上标记递推即可

 void get(char *s){int len=strlen(s+1);int now=1;long long nowl=0;for(int i=1;i<=len;i++){while(now!=1&&!mes[now].nxt[s[i]-'a']) now=mes[now].fa,nowl=mes[now].len;if(mes[now].nxt[s[i]-'a']){now=mes[now].nxt[s[i]-'a'],nowl++;ans+=(nowl-mes[mes[now].fa].len)*mes[now].cs1,mes[mes[now].fa].cs2++;//出现过的子串先处理这个节点表示的一部分} }}void dfs(int x,int op){for(int i=0;i<tu[x].size();i++){int p=tu[x][i];dfs(p,op);if(op==1) mes[x].cs1+=mes[p].cs1;else mes[x].cs2+=mes[p].cs2;}}void get_ans(char *s){for(int i=2;i<=sz;i++) tu[mes[i].fa].push_back(i);dfs(1,1);//先求出每个子串第一次出现次数get(s);dfs(1,2);for(int i=2;i<=sz;i++) ans+=1ll*(mes[i].len-mes[mes[i].fa].len)*mes[i].cs1*mes[i].cs2;printf("%lld",ans);}

2.真正的广义SAM

考虑trie树的优秀性质

他可以帮我们合并子串的部分相同前缀,降低时间复杂度

他可以帮我们更新字符串插入SAM的顺序,从而维护了SAM的性质

因为SAM插入是按照长度单调递增的顺序插入的,所以需要按照字典树bfs的顺序来插入

每次插入时las为字典树上这个节点的父亲,保证了串的完整性

然后每次多个串有相同的字符能够第一时间在SAM上建立关系,保证了时间复杂度

【模板】广义后缀自动机(广义 SAM)

先建出trie树,然后就化简为单个串本质不同子串个数了

注意的是,每个节点变化直接用trie树的就行了(保证las的对应性)

struct GSAM{SAM_node mes[2001000];int dic[2000100][30];int trie_sz;void init(){trie_sz=sam_sz=1;mes[1].fa=mes[1].len=0;}void insert_trie(char *s){int len=strlen(s+1),now=1;for(int i=1;i<=len;i++){int ty=s[i]-'a';if(!dic[now][ty]) dic[now][ty]=++trie_sz;now=dic[now][ty];}}    void insert_sam(int las,int ch){int now=dic[las][ch];mes[now].len=mes[las].len+1;while(las&&!mes[las].nxt[ch]) mes[las].nxt[ch]=now,las=mes[las].fa;if(!las) mes[now].fa=1;else{int to=mes[las].nxt[ch];if(mes[to].len==mes[las].len+1) mes[now].fa=to;else{int np=++trie_sz;mes[np]=mes[to],mes[np].len=mes[las].len+1;while(las&&mes[las].nxt[ch]==to) mes[las].nxt[ch]=np,las=mes[las].fa;mes[to].fa=mes[now].fa=np;}}}void get_mes(){queue<pair<int,int> >q;for(int i=0;i<26;i++){if(dic[1][i]) q.push({1,i});}while(!q.empty()){int ch=q.front().second,las=q.front().first;int x=dic[las][ch];q.pop(); insert_sam(las,ch);for(int i=0;i<26;i++){if(dic[x][i]) q.push({x,i});}}}void get_ans(){long long ans=0;for(int i=2;i<=trie_sz;i++) ans+=mes[i].len-mes[mes[i].fa].len;printf("%lld",ans); }
};

[ZJOI2015]诸神眷顾的幻想乡

树上求本质不同字符串

先要考虑到两点

1.将无根树的每一个叶子节点作为根,然后求每个节点到根的前缀子串,一定能够遍历所有的子串

2.不能每次新添加子串,记录上一个添加到的位置,在后面添加一个字符即可

这样就转化为了上一题

广义SAM(SAM套trie)相关推荐

  1. bzoj 3217 ALOEXT 替罪羊树套trie树

    感觉又刚了一遍带插入区间k小值... 这题写个替罪羊练一下.其实应该可以用重量平衡的treap套trie. 带插入维护一段区间的trie和次小值. 区间次小值随便维护,区间trie呢? 我会做!替罪羊 ...

  2. 2019.4.11 一题 XSY 1551 ——广义后缀数组(trie上后缀数组)

    参考:http://www.mamicode.com/info-detail-1949898.html (log2) https://blog.csdn.net/geotcbrl/article/de ...

  3. 服务器系统报错sam,sam 云服务器

    sam 云服务器 内容精选 换一换 如果Windows操作系统云服务器未安装密码重置插件,可以参见本节内容重新设置密码.本节操作介绍的方法仅适用于修改Windows本地账户密码,不能修改域账户密码.L ...

  4. 【SAM】51Nod1647 小Z的Trie

    [前言] 本来是用来愉悦身心的题目,结果因为自己一些zz错误弄得很不愉悦. [题目] 51Nod 给定一棵Trie\text{Trie}Trie(实际上是给出字符串自己建),QQQ次询问Trie\te ...

  5. SP8093 JZPGYZ - Sevenk Love Oimaster(广义SAM)

    SP8093 JZPGYZ - Sevenk Love Oimaster(广义SAM) 思路:广义 S A M SAM SAM构建文本串,然后用以一个 s z [ p ] sz[p] sz[p]表示状 ...

  6. 暑假集训 ---- 字符串2 (SAM专题)

    P1368 工艺 把串插入 S A M SAM SAM 插两次,然后贪心找最小字典序即可 [AHOI2013]差异 两个串的最长公共后缀就是后缀自动机上 lca 的长度 于是把两个串反过来,对于每一个 ...

  7. 2018-2019 ACM-ICPC南京 M. Mediocre String Problem(SAM+PAM)

    LINK 题意 给定串 s s s和串 t t t 要求在 s s s中找一个子串 s ′ s' s′(不需要本质不同), t t t中找一个前缀 t ′ t' t′ 满足 s ′ s' s′长度大于 ...

  8. 【SAM】BZOJ5137 [Usaco2017 Dec] Standing Out from the Herd

    [题目] lydsy 给定 n n n个字符串,对于每个字符串,问只在这个字符串中出现的子串有多少个. n , ∑ ∣ S ∣ ≤ 1 0 5 n,\sum|S|\leq 10^5 n,∑∣S∣≤10 ...

  9. sam服务器是什么_使用SAM CLI将机器学习模型部署到无服务器后端

    sam服务器是什么 介绍 (Introduction) Over the last year at CMRA, we have been incorporating more machine lear ...

  10. P5212-SubString【LCT,SAM】

    正题 题目链接:https://www.luogu.com.cn/problem/P5212 题目大意 开始一个字符串SSS,有nnn次操作 在SSS末尾加入一个字符串 询问一个串在SSS中出现了多少 ...

最新文章

  1. 【OpenCV 4开发详解】分割图像——分水岭法
  2. 关于锂离子法拉电容的短路实验
  3. python词频云图_python安娜卡列妮娜词云图制作
  4. 字符数组、字节数组、字符串转换
  5. python笔记之文件的基本操作和os模块
  6. animate.css官网
  7. windows--bat--设置变量的方法
  8. 利用ICallbackEventHandler接口实现Ajax效果
  9. 【转载】TreeView序列化,TreeView串行化,TreeView反序列化 c# winform
  10. 【系统分析师之路】第十九章 复盘知识产权标准化
  11. ue4 无限地图_基于UE4的开放世界地图架构
  12. 【网络--实验】华三防火墙命令行调试实例
  13. 【日成海外营销】如何利用TikTok进行红人营销?
  14. 游戏开发经验之游戏App是先做大用户量 还是先盈利呢
  15. 2.vulnhub-Xerxes靶机复现
  16. 配置 Rails 应用程序
  17. Kafka与其他MQ对比
  18. 工业相机和镜头的参数理解、选型、打光方案总结(附参考案例)
  19. android vitamio 实现快速播放,使用Vitamio打造自己的Android万能播放器(5)
  20. 如何对待焦虑与拖延症

热门文章

  1. android游戏地图编辑器
  2. Gym 100015B Ball Painting
  3. 求偶数c语言程序,用C语言编写一道程序计算100以内偶数的和
  4. 安卓投屏大师_好用的投屏软件合集—2020年
  5. JavaWeb(10.21)
  6. 强烈推荐:C#编码规范手册
  7. 三分钟看完北京城市(含京津冀)【总体规划2016-2050】
  8. DSPE-PEG-Cys/DQA/Rapamycin磷脂聚乙二醇修饰半胱氨酸/地喹氯铵/雷帕霉素
  9. python爬虫模拟登陆
  10. [ZT]毁人不倦的应试教育(3)