题目链接 \(Click\) \(Here\)

其实是看后缀数组资料看到这个题目的,但是一眼反应显然后缀自动机,每次维护添加节点后的答案贡献即可,唯一不友好的一点是需要平衡树维护,这里因为复杂度不卡而且也不需要用到\(ch\)数组的遍历访问,我采用了\(map\)的写法。

其实是因为不会平衡树维护啦,如果有机会还是要学一下啊。。这个题可是没给不用平衡树的部分分啊\(Qwq\)(直接全体\(1e9\))

#include <bits/stdc++.h>
using namespace std; const int N = 200010; struct Suffix_Auto {
int cnt, las; long long ans;
int fa[N], len[N];
map <int, int> ch[N]; Suffix_Auto () {
cnt = las = 1; ans = 0;
memset (fa, 0, sizeof (fa));
memset (len, 0, sizeof (len));
} void extend (int c) {
int p = las, q = ++cnt; las = q;
len[q] = len[p] + 1;
while (p != 0 && ch[p][c] == 0) {
ch[p][c] = q;
p = fa[p];
}
ans += len[q];
if (p == 0) {
fa[q] = 1;
} else {
int x = ch[p][c];
if (len[x] == len[p] + 1) {
fa[q] = x;
ans -= len[x];
} else {
int y = ++cnt;
fa[y] = fa[x];
fa[x] = fa[q] = y;
len[y] = len[p] + 1;
ch[y] = ch[x];
while (p != 0 && ch[p][c] == x) {
ch[p][c] = y;
p = fa[p];
}
ans -= len[y];
}
}
cout << ans << endl;
}
}sam; int n, num; int main () {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> num;
sam.extend (num);
}
}

Luogu P4070 [SDOI2016]生成魔咒的更多相关文章

  1. P4070 [SDOI2016]生成魔咒

    题目地址:P4070 [SDOI2016]生成魔咒 相信看到题目之后很多人跟我的思路是一样的-- 肯定要用 SA(P3809 [模板]后缀排序) 肯定要会求本质不同的子串个数(P2408 不同子串个数 ...

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

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

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

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

  4. [洛谷P4070][SDOI2016]生成魔咒

    题目大意:有一个字符串,每次在末尾加入一个字符,问当前共有多少个本质不同的字串 题解:$SAM$,就是问插入这个字符后,多了多少个字串,就是当前这个点的$Right$数组大小. 卡点:无 C++ Co ...

  5. BZOJ4516: [Sdoi2016]生成魔咒 后缀自动机

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> #inclu ...

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

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

  7. BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay

    BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔 ...

  8. 【LG4070】[SDOI2016]生成魔咒

    [LG4070][SDOI2016]生成魔咒 题面 洛谷 题解 如果我们不用在线输的话,那么答案就是对于所有状态\(i\) \[ \sum (i.len-i.fa.len) \] 现在我们需要在线询问 ...

  9. [Sdoi2016]生成魔咒[SAM or SA]

    4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 569[Submit][Statu ...

随机推荐

  1. orcale增加列脚本

    --编号declare v_cnt number; V_SQL VARCHAR2 (500) := '';begin select count(*) into v_cnt from dual wher ...

  2. 学习 Spring (十六) AOP API

    Spring入门篇 学习笔记 Spring AOP API 是 Spring 1.2 历史用法,现在仍然支持 这是 Spring AOP 基础,现在的用法也是基于历史的,只是更简便了 Pointcut ...

  3. codeforces259B

    Little Elephant and Magic Square CodeForces - 259B Little Elephant loves magic squares very much. A  ...

  4. henrylee2cn简单的rpc服务

    server 端package controllers import ( "github.com/henrylee2cn/teleport" "model/system& ...

  5. 解决Windows下Tomcat控制台中文乱码

    找到${CATALINA_HOME}/conf/logging.properties 添加语句:java.util.logging.ConsoleHandler.encoding = GBK 重启to ...

  6. HDU4349-Xiao Ming's Hope-找规律

    打表输出前100之后,找到规律. 不过正确规律是1<<(二进制中1的个数). #include <cstdio> #include <algorithm> usin ...

  7. LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】

    先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...

  8. Eclipse中项目Project Explorer视图与Package Explorer视图

    Package Explorer视图: Project Explorer视图 两种视图的切换:

  9. rar自动压缩备份

    rem ******MySQL backup start********@echo offforfiles /p "D:\备份\发布软件备份" /m backup_*.sql -d ...

  10. Java 强制类型转换(类转换注意事项)

    将一个类型强制转换成另一个类型的过程被称为类型转换.例如: double x =3.14; int y = (int)x; 将表达式x的值转换成整数类型,舍弃小数部分. 有时候也可能是类的对象引用的转 ...