Jzoj5665 奥立卡的诗
终于又遇到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 奥立卡的诗相关推荐
- 博尔赫斯-诗中的经典语段
我用什么才能留住你? 我给你瘦弱的街道.绝望的日落.荒郊的月亮. 我给你一个久久望着孤月的人的悲怆. -博尔赫斯<我用什么才能留住你> 命运之神没有怜悯之心,上帝的长夜没有尽期,你的肉体只 ...
- 征战奥斯卡,3部冲奥动画短片制作解析抢鲜看
年终将至,颁奖季也随之而来,奥斯卡刚刚释出2022年度"最佳动画短片奖"获得参赛资格作品的完整名单. 目前84部作品获得参赛资格,较往年的平均96部作品,今年作品数量稍有减少. 参 ...
- 影之诗闪卡动图_影之诗怎么制作闪卡_闪卡的制作方法_软吧
影之诗怎么制作闪卡呢?闪卡由于具有动态效果而受到很多玩家的欢迎.但是闪卡的制作流程也是蛮麻烦的.下面就让小易为大家带来影之诗闪卡的制作方法,感兴趣的小伙伴一起来看看吧. 制作方法 Step 1:找到想 ...
- 数学传奇丘成桐:《诗》明方向,《史记》教抉择
http://www.mathrs.net/news.php?id=1183 昨日,丘成桐作为湖南师范大学研究生"麓山论坛"学术年会的压轴嘉宾,在长沙和学子们畅谈"研求之 ...
- 奥利奥0糖系列全网首发;雀巢芭绮率先入驻哈尔滨;疫情后红参需求大幅上升...
雀巢.每日优鲜.奥利奥.韩国人参公社.美国流行威士忌酩帝诗等企业最新动态. 新店开业 雀巢旗下巧克力品牌芭绮正式进入中国 雀巢宣布在哈尔滨中央大街开设意式甜品店,为广大消费者提供意大利国宝级巧克力品牌 ...
- 亚当·扎加耶夫斯基诗十二首
亚当·扎加耶夫斯基诗十二首 黄灿然译 神秘主义入门 天气很暖和,光很充沛. 咖啡馆露台上那德国人 膝上搁着一本小书. 我瞥见那书名: <神秘主义入门>. 突然间我明白了,那些 打着尖利的忽 ...
- 中秋佳节,用 AI 为家人写一首诗(文末送中秋福利)
作者:神经小兮 来源:HyperAI超神经 中秋节即将来临,这个团圆赏月的节日,激发了古今无数文人的情怀,留下了 诸多隽永的诗句. 面对中秋 ...
- 清华团队让 AI 写诗“更上一层楼”,诗歌图灵测试迷惑近半数玩家
作者 | 黄珊 来源 | 数据实战派 比特币 外挖无穷洞,机神犹未休. 卡中窥币影,池里验沙流. 屡载吸金主,孤深渍盗求. 方知区块链,本是古来游. 这首诗歌来自一支清华团队开发的古诗 AI.它的创作 ...
- “奥利”来啦,腾讯Robotics X实验室跑出的“轮滑小子”
6月3日,腾讯Robotics X实验室的新成员--轮腿式机器人Ollie(奥利)正式亮相,它是机器狗Jamoca.Max和自平衡自行车之后,实验室又一创新成果. 轮腿式机器人(wheel-legge ...
最新文章
- 高翔Slambook第七讲代码解读(2d-2d位姿估计)
- PsSetCreateProcessNotifyRoutineEx进程监控框架
- tensorflow入门基础
- 多位院士、院士候选人入选,132人拟获表彰!
- zrender zlevel层叠控制和Group使用笔记
- python 同步event对象
- CString char BSTR 转换
- 论SetItemData和GetItemData
- linux 防火墙 80端口,Linux配置防火墙,开启80端口、3306端口
- Matlab2017a(64位)安装包下载及详细安装步骤
- 揭开 gcc 编辑器的面貌
- 高等数学复习要点(期末考试同济版)
- UmiJs(v3.x版本)
- 相爱相杀:移动联通IT支撑回忆录(九)
- 计算机网络(第五版)读书笔记
- RLC电阻电感电容取值标准
- cutelyst教程_01 _简介
- Error:Execution failed for task ':recordlib:lint'. Lint found errors in the project; aborting buil
- ES 检索 word、pdf 文档插件 ingest attachment 的管道配置和文档结构映射
- 360测试开发面试总结 -- 失败