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 共有多少种生成魔咒。

Solution

后缀自动机做又短又快

后缀自动机学习小记
每一次 ans+=t[np].len−t[t[np].fa].len ans+=t[np].len-t[t[np].fa].len就可以了。

直接减trie空间不行

c++有一个map,简单的代替trie的数组。
不然,可以hash然后建邻接表。

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cmath>
#include<map>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=100007;
int i,j,k,l,n,m,last,num,yi,er;
long long ans;
struct node{int len,fa;
}t[maxn*2];
map<int,int>son[maxn*2];
int np,nq,p,q;
void extend(int c){p=last,np=++num;t[np].len=t[p].len+1;while(p&&!son[p][c])son[p][c]=np,p=t[p].fa;if(!p)t[np].fa=1;else{q=son[p][c];if(t[q].len==t[p].len+1)t[np].fa=q;else{nq=++num;for(map<int,int>::iterator i=son[q].begin();i!=son[q].end();i++){son[nq][i->first]=i->second;    }t[nq]=t[q];t[nq].len=t[p].len+1;t[q].fa=t[np].fa=nq;while(p&&son[p][c]==q)son[p][c]=nq,p=t[p].fa;}}last=np;
}
int main(){freopen("incantation.in","r",stdin);freopen("incantation.out","w",stdout);scanf("%d",&n);last=num=1;fo(i,1,n){scanf("%d",&k);extend(k);ans+=t[np].len-t[t[np].fa].len;printf("%lld\n",ans);}
}

【SDOI2016】生成魔咒相关推荐

  1. [SDOI2016]生成魔咒

    4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1460  Solved: 835 [Submit][Sta ...

  2. BZOJ4516: [Sdoi2016]生成魔咒

    BZOJ4516: [Sdoi2016]生成魔咒 Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示. 例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒 ...

  3. BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]

    4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ...

  4. P4070 [SDOI2016]生成魔咒

    P4070 [SDOI2016]生成魔咒 题意: 有n个字符xi,每次在S的末尾加入一个字符,(一开始S为空),每次加入xi后的不相同字串有多少个 题解: 做这个题首先要会后缀数组P3809 [模板] ...

  5. 洛谷 P4070 [SDOI2016]生成魔咒 解题报告

    P4070 [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 \(1\).\(2\) 拼凑起来形成一个魔咒串 \([1,2]\). 一个魔咒 ...

  6. P4070 [SDOI2016]生成魔咒(SAM len数组的含义)

    [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 , 2 1,2 1,2 拼凑起来形成一个魔咒串 [ 1 , 2 ] [1,2] [1, ...

  7. bzoj4516 / P4070 [SDOI2016]生成魔咒

    P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸 ...

  8. 【刷题】BZOJ 4516 [Sdoi2016]生成魔咒

    Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...

  9. [SDOI2016] 生成魔咒(后缀数组SA + st表 + set)动态不同子串个数

    problem luogu-P4070 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1,21,21,2 拼凑起来形成一个魔咒串 [1,2][1,2][1,2]. 一个魔咒串 ...

  10. 洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机

    题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1, ...

最新文章

  1. 太火!这本AI图书微软强推,程序员靠它拿下50K!
  2. button/input链接方式全攻略 [转]
  3. java多图片上传json_SpringMVC框架五:图片上传与JSON交互
  4. flex布局应用与踩坑
  5. OpenGL编程指南-理解入门笔记
  6. oracle imp仅导入数据
  7. 可以打印快递电子面单的表格
  8. 仙侠手游服务器搭建。
  9. 数字电子技术-逻辑门电路
  10. 大学生计算机水平怎么提高,大学生如何提高计算机能力
  11. nginx网关与gateway网关的区别
  12. win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...
  13. API MISUSE: Cancelling connection for unused peripheral
  14. 插屏广告怎么玩?这些优化要点请get~
  15. pointnet语义分割_训练并预测自己的数据
  16. Mysql:外码约束
  17. 腾讯网页登陆的加密机制
  18. 基于jsp+mysql+Spring+SpringMVC+mybatis的ssm生鲜超市进销存管理系统
  19. memcached 注册服务器,Memcached深入剖析(一)—Memcached服务器安装
  20. canvas实现走势图实现

热门文章

  1. DLNA 实现 Multi-screen(T460s+华为M3)
  2. deque python_python实现Deque
  3. Android快速转战Kotlin教程,分享一点面试小经验
  4. U盘不显示盘符问题怎么办?
  5. 微信域名检测实用工具
  6. 兔子繁衍问题-暴力破解+斐波那契
  7. JAVA string、int、 double 转换
  8. Z-Tech|你未知的极氪黑科技:3.8s背后的极芯
  9. 跟大伙儿聊一聊「陪媳妇练车」这事儿
  10. c语言字节和字的区别,字、字节、位、字长?区别?关系?