[BZOJ4516][SDOI2016]生成魔咒(后缀自动机)
2018-03-28 17:12
525 查看
4516: [Sdoi2016]生成魔咒
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1549 Solved: 899
[Submit][Status][Discuss]Description
魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。 例如 S=[1,2,1] 时,它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1] 五种。S=[1,1,1] 时,它的生成魔咒有 [1]、 [1,1]、[1,1,1] 三种。最初 S 为空串。共进行 n 次操作,每次操作是在 S 的结尾加入一个魔咒字符。每次操作后都 需要求出,当前的魔咒串 S 共有多少种生成魔咒。Input
第一行一个整数 n。 第二行 n 个数,第 i 个数表示第 i 次操作加入的魔咒字符。 1≤n≤100000。,用来表示魔咒字符的数字 x 满足 1≤x≤10^9Output
输出 n 行,每行一个数。第 i 行的数表示第 i 次操作后 S 的生成魔咒数量
Sample Input
7
1 2 3 3 3 1 2Sample Output
1
3
6
9
12
17
22HINT
Source
[Submit][Status][Discuss]
SAM裸题?son数组用map存,实时统计mx[i]-mx[fa[i]]即可。
#include<map> #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef long long ll; using namespace std; const int N=400100; map<int,int>son ; int cnt=1,lst=1,p,np,n,mx ,fa ,a ; ll ans; int F(int x){ return mx[x]-mx[fa[x]]; } void ext(int c){ p=lst; np=lst=++cnt; mx[np]=mx[p]+1; while (p && !son[p][c]) son[p][c]=np,p=fa[p]; if (!p) fa[np]=1,ans+=F(np); else{ int q=son[p][c]; if (mx[q]==mx[p]+1) fa[np]=q,ans+=F(np); else{ int nq=++cnt; mx[nq]=mx[p]+1; son[nq]=son[q]; while (p && son[p][c]==q) son[p][c]=nq,p=fa[p]; fa[nq]=fa[q]; ans+=F(nq)-F(q); fa[q]=fa[np]=nq; ans+=F(np)+F(q); } } } int main(){ freopen("incantation.in","r",stdin); freopen("incantation.out","w",stdout); scanf("%d",&n); rep(i,1,n) scanf("%d",&a[i]),ext(a[i]),printf("%lld\n",ans); return 0; }
相关文章推荐
- [BZOJ4516][Sdoi2016]生成魔咒(后缀数组+set/后缀自动机)
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
- 【bzoj4516】[Sdoi2016]生成魔咒 后缀自动机
- BZOJ4516 [Sdoi2016]生成魔咒 后缀自动机
- [BZOJ4516][SDOI2016]生成魔咒(后缀自动机)
- bzoj 4516: [Sdoi2016]生成魔咒 (后缀自动机)
- [BZOJ4516][Sdoi2016]生成魔咒(后缀数组+链表||后缀自动机)
- BZOJ 4516: [Sdoi2016]生成魔咒 后缀自动机
- [BZOJ4516] [SDOI2016] 生成魔咒 - 后缀数组/后缀自动机
- [bzoj4516][Sdoi2016]生成魔咒——后缀自动机
- BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)
- BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机
- bzoj 4516 [Sdoi2016]生成魔咒 后缀自动机
- BZOJ4516 [Sdoi2016]生成魔咒 【后缀自动机】
- BZOJ.4516.[SDOI2016]生成魔咒(后缀数组 RMQ)
- bzoj 4516: [Sdoi2016]生成魔咒 后缀数组
- 【BZOJ4516】【Sdoi2016】生成魔咒 后缀数组 线段树
- 【bzoj4516】[Sdoi2016]生成魔咒 后缀数组+倍增RMQ+STL-set
- BZOJ4516: [Sdoi2016]生成魔咒 后缀自动机
- 【bzoj4516】 Sdoi2016—生成魔咒