博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj4516: [Sdoi2016]生成魔咒
阅读量:5123 次
发布时间:2019-06-13

本文共 1030 字,大约阅读时间需要 3 分钟。

就是SAM嘛。

答案累加就是dep[parent[now]]-dep[now]

有个比较坑的就是要用map。。

#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;int a[210000];map
ch[410000];int root,last,cnt;LL ans;int parent[410000],dep[410000];void add(int k){ int x=a[k]; int now=++cnt,p=last; dep[now]=k; while(p!=0&&ch[p][x]==0) ch[p][x]=now,p=parent[p]; if(p==0)parent[now]=root; else { int pre=ch[p][x]; if(dep[pre]==dep[p]+1)parent[now]=pre; else { int npre=++cnt; ch[npre]=ch[pre]; parent[npre]=parent[pre]; dep[npre]=dep[p]+1; parent[now]=parent[pre]=npre; while(p!=0&&ch[p][x]==pre) ch[p][x]=npre,p=parent[p]; } } last=now; if(parent[now]==0)ans+=(LL(dep[now])); else ans+=(LL(dep[now]-dep[parent[now]]));}int main(){ int n; scanf("%d",&n); root=last=cnt=1;ans=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]),add(i); printf("%lld\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/8693601.html

你可能感兴趣的文章
●枚举、递归
查看>>
使用LSTM和Softmx来进行意图识别
查看>>
asp.net与oracle连接字符串
查看>>
opencv学习之路(4)、Mat类介绍,基本绘图函数
查看>>
POJ 1308
查看>>
Django+xadmin打造在线教育平台(二)
查看>>
BZOJ 4836: [Lydsy1704月赛]二元运算 分治FFT
查看>>
域名、网站名、URL
查看>>
Docker常用命令
查看>>
mysql几种存储引擎介绍
查看>>
转-Android客户端和服务端如何使用Token和Session
查看>>
IOS第14天(2, Modal控制)
查看>>
删除确认代码
查看>>
刻意练习
查看>>
学习笔记13_第三方js控件&EasyUI使用
查看>>
Java变量的初始化问题探究
查看>>
DSU on tree——令人惊叹的想法
查看>>
javascript 闭包
查看>>
约瑟夫环问题
查看>>
c++ __int64
查看>>