【LG4070】[SDOI2016]生成魔咒
【LG4070】[SDOI2016]生成魔咒
题面
题解
如果我们不用在线输的话,那么答案就是对于所有状态\(i\)
\]
现在我们需要在线询问,那么因为\(SAM\)是在线算法,我们考虑每次的对答案的贡献。
那么产生的贡献就是\(last.len-last.fa.len\)。
与\(yyb\)的对话:
Q:为什么构建自动机时中间过程新加的点不会算到最后答案中呢?
A:不影响答案啊,你在两个len之间断开,对于答案的贡献不变。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <tr1/unordered_map>
using namespace std;
using namespace std::tr1;
inline int gi() {
    register int data = 0, w = 1;
    register char ch = 0;
    while (!isdigit(ch) && ch != '-') ch = getchar();
    if (ch == '-') w = -1, ch = getchar();
    while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
    return w * data;
}
const int MAX_N = 1e5 + 5;
struct Node {
	unordered_map<int, int> ch;
	int len, fa;
} t[MAX_N << 1];
int tot = 1, lst = 1;
long long ans = 0;
void extend(int c) {
	int New = ++tot;
	t[lst].ch[c] = New;
	t[New].len = t[lst].len + 1;
	int p = t[lst].fa; lst = tot;
	while (p && t[p].ch.find(c) == t[p].ch.end()) t[p].ch[c] = New, p = t[p].fa;
	if (!p) t[New].fa = 1;
	else {
		int q = t[p].ch[c];
		if (t[q].len == t[p].len + 1) t[New].fa = q;
		else {
			int _q = ++tot; t[_q] = t[q];
			t[New].fa = t[q].fa = _q, t[_q].len = t[p].len + 1;
			while (p) {
				unordered_map<int, int> :: iterator ite;
				ite = t[p].ch.find(c);
				if (ite == t[p].ch.end() || ite->second != q) break;
				t[p].ch[c] = _q;
				p = t[p].fa;
			}
		}
	}
	ans += t[New].len - t[t[New].fa].len;
} 
int main () {
#ifndef ONLINE_JUDGE
    freopen("cpp.in", "r", stdin);
#endif
	int N = gi();
	for (int i = 1; i <= N; i++) extend(gi()), printf("%lld\n", ans);
    return 0;
}
【LG4070】[SDOI2016]生成魔咒的更多相关文章
- BZOJ4516: [Sdoi2016]生成魔咒 后缀自动机
		#include<iostream> #include<cstdio> #include<cstring> #include<queue> #inclu ... 
- BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
		4516: [Sdoi2016]生成魔咒 题意:询问一个字符串每个前缀有多少不同的子串 做了一下SDOI2016R1D2,题好水啊随便AK 强行开map上SAM 每个状态的贡献就是\(Max(s)-M ... 
- BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay
		BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔 ... 
- P4070 [SDOI2016]生成魔咒
		题目地址:P4070 [SDOI2016]生成魔咒 相信看到题目之后很多人跟我的思路是一样的-- 肯定要用 SA(P3809 [模板]后缀排序) 肯定要会求本质不同的子串个数(P2408 不同子串个数 ... 
- bzoj4516 / P4070 [SDOI2016]生成魔咒
		P4070 [SDOI2016]生成魔咒 后缀自动机 每插入一个字符,对答案的贡献为$len[last]-len[fa[last]]$ 插入字符范围过大,所以使用$map$存储. (去掉第35行就是裸 ... 
- 洛谷 P4070 [SDOI2016]生成魔咒 解题报告
		P4070 [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 \(1\).\(2\) 拼凑起来形成一个魔咒串 \([1,2]\). 一个魔咒 ... 
- [Sdoi2016]生成魔咒[SAM or SA]
		4516: [Sdoi2016]生成魔咒 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1017 Solved: 569[Submit][Statu ... 
- 4516: [Sdoi2016]生成魔咒
		4516: [Sdoi2016]生成魔咒 链接 题意: 求本质不同的子串. 分析: 后缀数组或者SAM都可以. 考虑SAM中每个点的可以表示的子串是一个区间min(S)~max(S),把每个点的这个区 ... 
- [SDOI2016] 生成魔咒 - 后缀数组,平衡树,STL,时间倒流
		[SDOI2016] 生成魔咒 Description 初态串为空,每次在末尾追加一个字符,动态维护本质不同的子串数. Solution 考虑时间倒流,并将串反转,则变为每次从开头删掉一个字符,即每次 ... 
随机推荐
- CentOS 7下安装Python3.5
			CentOS 7下安装Python3.5 •安装python3.5可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-deve ... 
- 【SPL标准库专题(5)】 Datastructures:SplStack & SplQueue
			这两个类都是继承自SplDoublyLinkedList,分别派生自SplDoublyLinkedList的堆栈模式和队列模式:所以放在一起来介绍: 堆栈SplStack # 类摘要 SplStack ... 
- c#WebApi使用form表单提交excel,实现批量写入数据库
			思路:用户点击下载模板按钮,获取到excel模板,然后向里面填写数据保存.from表单提交的时候选择保存好的excel,实现数据的批量导入过程 先把模板放在服务器的项目目录下面:如 模板我一般放在:F ... 
- 多个div中的label标签对齐
			这是之前的页面效果: 添加红色部门的代码后: <head> <meta name="viewport" content="width=device-wi ... 
- XtraEditors五、SpinEdit、TimeEdit
			SpinEdit控件 此按钮控件是用来增加或减少在编辑的文本编辑区显示的数值, 该编辑值可以是一个整数或浮点数. 其 Text属性 用于设置编辑区的文本: 其 Value属性 用于获取编辑区的值: 示 ... 
- 使用JavaScript实现简单的小游戏-贪吃蛇
			最近初学JavaScript,在这里分享贪吃蛇小游戏的实现过程, 希望能看到的前辈们能指出这个程序的不足之处. 大致思路 首先要解决的问题 随着蛇头的前进,尾巴也要前进. 用键盘控制蛇的运动方向. 初 ... 
- 复杂json的解析:jsonobject与jsonArray的使用
			String parameter = { success : 0, errorMsg : "错误消息", data : { total : "总记录数", ro ... 
- Alpha冲刺报告(4/12)(麻瓜制造者)
			今日完成的情况 江郑: 今天对数据库的需求部分进行了完善 邓弘立: 完成了首页界面UI 刘双玉: 基本完成商品信息发布接口 汪志彬: 尝试UI的设计 符天愉: 将登录接口部署到服务器上,结果Linux ... 
- PyQt5--InputDiaglog
			# -*- coding:utf-8 -*- ''' Created on Sep 14, 2018 @author: SaShuangYiBing Comment: ''' import sys f ... 
- 【Android自动化】测试系统的应用程序安装与卸载性能,判断长时间反复安装对系统的整体性能影响
			# -*- coding:utf-8 -*- import sys import os import time import subprocess from uiautomator import de ... 
