终于又遇到SAM的题了好好玩,而且就这道题让我弄清楚了广义SAM和Trie上SAM的区别

其实两者是没有多少区别的,不过Trie上SAM可以更快

关于Trie上SAM,是用bfs的方法来构建的,相比起广义SAM用dfs建少了一个深度之和的部分

但是如果原题给的就是Trie那么就只能用bfs了,因为dfs会被卡成O(n^2) (考虑一个扫把)

回到本题,简化一下式子发现这道题求的是不同子串的出现次数的平方和

我们建出整个诗的广义SAM,对于一次询问,

我们将一个串每个前缀对应的节点size都加一,树链剖分来维护所有节点的权值平方和

让后就愉快的过了

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 600010
#define LL long long
#define mid (l+r>>1)
#define ls l,mid,x<<1
#define rs mid+1,r,x<<1|1
using namespace std;
char C[N]; LL ans=0;
struct edge{ int v,nt; } G[N<<1];
int n,m,cnt,clk,h[N],f[N],d[N],sz[N];
int top[N],w[N],l[N],son[N],dx[N]; LL s2[N<<2],s[N<<2],t[N<<2],c[N<<2];
inline void ps(int x){ s[x]=s[x<<1]+s[x<<1|1];s2[x]=s2[x<<1]+s2[x<<1|1];
}
inline void adj(int x,int y){G[++cnt]=(edge){y,h[x]}; h[x]=cnt;G[++cnt]=(edge){x,h[y]}; h[y]=cnt;
}
inline void dfs(int x,int p){f[x]=p; d[x]=d[p]+1; sz[x]=1;for(int v,i=h[x];i;i=G[i].nt)if(!d[v=G[i].v]){dfs(v,x);sz[x]+=sz[v];if(sz[v]>sz[son[x]]) son[x]=v;}
}
inline void dgs(int x,int p){w[++clk]=x; l[x]=clk; top[x]=p;if(son[x]) dgs(son[x],p);for(int v,i=h[x];i;i=G[i].nt)if(!top[v=G[i].v]) dgs(v,v);
}
inline void build(int l,int r,int x){if(l==r){ c[x]=dx[w[l]]; return; }build(ls);build(rs);c[x]=c[x<<1]+c[x<<1|1];
}
inline void pd(int x){if(t[x]){t[x<<1]+=t[x];t[x<<1|1]+=t[x];s2[x<<1]+=t[x]*t[x]*c[x<<1]+2*t[x]*s[x<<1];s2[x<<1|1]+=t[x]*t[x]*c[x<<1|1]+2*t[x]*s[x<<1|1];s[x<<1]+=c[x<<1]*t[x];s[x<<1|1]+=c[x<<1|1]*t[x];t[x]=0;}
}
inline void add(int l,int r,int x,int L,int R){if(L<=l && r<=R){s2[x]+=c[x]+2*s[x];s[x]+=c[x]; t[x]++; return;}pd(x);if(L<=mid) add(ls,L,R);if(mid<R) add(rs,L,R);ps(x);
}
inline void gLca(int x){for(;x;x=f[top[x]])add(1,n,1,l[top[x]],l[x]);
}
struct SAM{int s[N][26],mx[N],f[N],cnt,lst;SAM(){ cnt=lst=1; }inline int extend(int c){int p=lst,np=lst=++cnt,q,nq;mx[np]=mx[p]+1;for(;p&&!s[p][c];p=f[p]) s[p][c]=np;if(!p) return f[np]=1;q=s[p][c];if(mx[q]==mx[p]+1) f[np]=q;else{nq=++cnt;mx[nq]=mx[p]+1;f[nq]=f[q]; f[q]=f[np]=nq;memcpy(s[nq],s[q],26<<2);for(;p&&s[p][c]==q;p=f[p]) s[p][c]=nq;}}inline void Ex_extend(int c){int p=lst,q=s[p][c],nq;if(q){if(mx[q]==mx[p]+1){ lst=q; }else{lst=nq=++cnt;mx[nq]=mx[p]+1;f[nq]=f[q]; f[q]=nq;memcpy(s[nq],s[q],26<<2);for(;p&&s[p][c]==q;p=f[p]) s[p][c]=nq;}} else extend(c);}inline void BT(){for(int i=2;i<=cnt;++i){adj(f[i],i);dx[i]=mx[i]-mx[f[i]];}}
} S;
int main(){freopen("poem.in","r",stdin);freopen("poem.out","w",stdout);scanf("%d",&n);for(int j=0;n--;++j){scanf("%s",C+j); S.lst=1;for(;C[j];++j) S.Ex_extend(C[j]-'a');}n=S.cnt; S.BT(); dfs(1,0); dgs(1,1); build(1,n,1);for(int x=1,j=0;C[j];++j){x=1;while(C[j]){x=S.s[x][C[j]-'a'];gLca(x); ++j;}printf("%lld\n",s2[1]);}
}

Jzoj5665 奥立卡的诗相关推荐

  1. 博尔赫斯-诗中的经典语段

    我用什么才能留住你? 我给你瘦弱的街道.绝望的日落.荒郊的月亮. 我给你一个久久望着孤月的人的悲怆. -博尔赫斯<我用什么才能留住你> 命运之神没有怜悯之心,上帝的长夜没有尽期,你的肉体只 ...

  2. 征战奥斯卡,3部冲奥动画短片制作解析抢鲜看

    年终将至,颁奖季也随之而来,奥斯卡刚刚释出2022年度"最佳动画短片奖"获得参赛资格作品的完整名单. 目前84部作品获得参赛资格,较往年的平均96部作品,今年作品数量稍有减少. 参 ...

  3. 影之诗闪卡动图_影之诗怎么制作闪卡_闪卡的制作方法_软吧

    影之诗怎么制作闪卡呢?闪卡由于具有动态效果而受到很多玩家的欢迎.但是闪卡的制作流程也是蛮麻烦的.下面就让小易为大家带来影之诗闪卡的制作方法,感兴趣的小伙伴一起来看看吧. 制作方法 Step 1:找到想 ...

  4. 数学传奇丘成桐:《诗》明方向,《史记》教抉择

    http://www.mathrs.net/news.php?id=1183 昨日,丘成桐作为湖南师范大学研究生"麓山论坛"学术年会的压轴嘉宾,在长沙和学子们畅谈"研求之 ...

  5. 奥利奥0糖系列全网首发;雀巢芭绮率先入驻哈尔滨;疫情后红参需求大幅上升...

    雀巢.每日优鲜.奥利奥.韩国人参公社.美国流行威士忌酩帝诗等企业最新动态. 新店开业 雀巢旗下巧克力品牌芭绮正式进入中国 雀巢宣布在哈尔滨中央大街开设意式甜品店,为广大消费者提供意大利国宝级巧克力品牌 ...

  6. 亚当·扎加耶夫斯基诗十二首

    亚当·扎加耶夫斯基诗十二首 黄灿然译 神秘主义入门 天气很暖和,光很充沛. 咖啡馆露台上那德国人 膝上搁着一本小书. 我瞥见那书名: <神秘主义入门>. 突然间我明白了,那些 打着尖利的忽 ...

  7. 中秋佳节,用 AI 为家人写一首诗(文末送中秋福利)

      作者:神经小兮                来源:HyperAI超神经              中秋节即将来临,这个团圆赏月的节日,激发了古今无数文人的情怀,留下了 诸多隽永的诗句. 面对中秋 ...

  8. 清华团队让 AI 写诗“更上一层楼”,诗歌图灵测试迷惑近半数玩家

    作者 | 黄珊 来源 | 数据实战派 比特币 外挖无穷洞,机神犹未休. 卡中窥币影,池里验沙流. 屡载吸金主,孤深渍盗求. 方知区块链,本是古来游. 这首诗歌来自一支清华团队开发的古诗 AI.它的创作 ...

  9. “奥利”来啦,腾讯Robotics X实验室跑出的“轮滑小子”

    6月3日,腾讯Robotics X实验室的新成员--轮腿式机器人Ollie(奥利)正式亮相,它是机器狗Jamoca.Max和自平衡自行车之后,实验室又一创新成果. 轮腿式机器人(wheel-legge ...

最新文章

  1. 高翔Slambook第七讲代码解读(2d-2d位姿估计)
  2. PsSetCreateProcessNotifyRoutineEx进程监控框架
  3. tensorflow入门基础
  4. 多位院士、院士候选人入选,132人拟获表彰!
  5. zrender zlevel层叠控制和Group使用笔记
  6. python 同步event对象
  7. CString char BSTR 转换
  8. 论SetItemData和GetItemData
  9. linux 防火墙 80端口,Linux配置防火墙,开启80端口、3306端口
  10. Matlab2017a(64位)安装包下载及详细安装步骤
  11. 揭开 gcc 编辑器的面貌
  12. 高等数学复习要点(期末考试同济版)
  13. UmiJs(v3.x版本)
  14. 相爱相杀:移动联通IT支撑回忆录(九)
  15. 计算机网络(第五版)读书笔记
  16. RLC电阻电感电容取值标准
  17. cutelyst教程_01 _简介
  18. Error:Execution failed for task ':recordlib:lint'. Lint found errors in the project; aborting buil
  19. ES 检索 word、pdf 文档插件 ingest attachment 的管道配置和文档结构映射
  20. 360测试开发面试总结 -- 失败

热门文章

  1. 电脑怎样把几个视频合成一个视频
  2. 从钉钉到金蝶云星空通过接口配置打通数据
  3. 分布式发布订阅消息系统 Kafka 架构设计 - 目前见到的最好的Kafka中文文章
  4. 小米2013校园招聘笔试题
  5. ROS学习——工作空间覆盖
  6. 计算机硬件 — 计算机简介
  7. 华为ICT大赛-江西省省赛网络赛道-数通练习题
  8. linux基本功之fsck命令详解
  9. 通往全栈工程师的捷径 —— React
  10. 为什么学编程的人大多数都去了深圳和北京?