P4070 [SDOI2016]生成魔咒

后缀自动机

每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$

插入字符范围过大,所以使用$map$存储。

(去掉第35行就是裸的板子了。)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cctype>
 5 #include<map>
 6 using namespace std;
 7 void read(int &x){
 8     static char c=getchar();x=0;
 9     while(!isdigit(c)) c=getchar();
10     while(isdigit(c)) x=x*10+(c^48),c=getchar();
11 }
12 #define N 100005
13 long long ans;
14 struct Sam{
15     int fa[N<<1],len[N<<1];
16     int last,ed,p,q;
17     map <int,int> nxt[N<<1];
18     Sam(){last=ed=1;}
19     void init(){
20         int n,c; read(n);
21         while(n--) read(c),add(c),printf("%lld\n",ans);
22     }
23     void add(int c){
24         p=last; len[last=++ed]=len[p]+1;
25         for(;p&&!nxt[p][c];p=fa[p]) nxt[p][c]=ed;
26         if(!p) fa[ed]=1;
27         else{
28             q=nxt[p][c];
29             if(len[q]==len[p]+1) fa[ed]=q;
30             else{
31                 len[++ed]=len[p]+1; nxt[ed]=nxt[q];
32                 fa[ed]=fa[q]; fa[q]=fa[ed-1]=ed;
33                 for(;nxt[p][c]==q;p=fa[p]) nxt[p][c]=ed;
34             }
35         }ans+=len[last]-len[fa[last]];//对答案的贡献
36     }
37 }sam;
38 int main(){sam.init(); return 0;}

转载于:https://www.cnblogs.com/kafuuchino/p/10220793.html

bzoj4516 / P4070 [SDOI2016]生成魔咒相关推荐

  1. P4070 [SDOI2016]生成魔咒

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

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

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

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

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

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

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

  5. luogu P4070 [SDOI2016]生成魔咒

    首先有两个结论: 1.后缀自动机具有最简性,即每种不同的子串只会在sam上体现一次,体现形式是sam上一条由root出发的路径. 2.一个字符串不同子串的个数等于所有关键节点的max(x)-min(x ...

  6. P4070 [SDOI2016]生成魔咒(SAM)

    传送门 用后缀数组做的真的心累 后缀数组+ST表+反串思维+set(或平衡树)动态维护 h e i g h t height height数组 然后用 S A M SAM SAM就是模板题- 要求本质 ...

  7. BZOJ4516: [Sdoi2016]生成魔咒

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

  8. [SDOI2016]生成魔咒

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

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

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

最新文章

  1. Windows App开发之集成设置、帮助、搜索和共享
  2. c语言奇数阶换房,(完整版)C语言酒店管理系统.docx
  3. BZOJ 1631: [Usaco2007 Feb]Cow Party【最短路】
  4. nssl1470-X【并查集,素数】
  5. 使用镜像源安装EASY_INSTALL和PIP教程
  6. Emmet的html语法
  7. 通过cmd和npm指令,快速引入element-ui组件
  8. RAID及LVM,iscsi
  9. python开发面试笔试题_python集合面试笔试题
  10. The history and design philosophy of Spring
  11. 95-40-050-java.util.concurrent-CopyOnWriteArraySet
  12. Flink SQL实时数仓开源UI平台
  13. 哈夫曼树的生成详解(C++)
  14. vs工程 vcproj和开发环境定义宏
  15. java中的常用语句
  16. 个税计算、税基的处理
  17. 【UOJ449】【集训队作业2018】喂鸽子(概率DP)
  18. JavaProperties文件操作
  19. 02网络爬虫-使用 Beautiful Soup 解析网页
  20. 微信小程序等第三方应用接入易班的api

热门文章

  1. 自己记录一下,多卡改单卡
  2. mysql out of memory 解决_mysqld-nt: Out of memory (Needed 1677720 bytes)解决方法
  3. 思维方式才是你职业瓶颈期的根本原因
  4. 【技术】解决Maven创建web工程web.xml版本过低的问题,妈妈再也不用的担心我的学习了
  5. SQL 连接(Join )
  6. 互联网公司很年轻?拼多多、字节人均年龄27岁,阿里31岁...
  7. BC26 NB-IoT模组MQTT通信测试(通信猫)
  8. strongswan libipsec
  9. 一些Markdown编辑器
  10. 超声检测的A扫描、B扫描、C扫描