【SAM】bzoj5084: hashit
做得心 力 憔 悴
Description
Input
Output
题目分析
陈老师神题x2,暂时只会做法一。
做法一:暴力回退
还是自己菜啊……这么个暴力都写了老久。
思路就是将每一次的修改值都记录下来,再在$undo()$里回退每一个修改。说得是轻松,但是具体的实现还是要仔细安排一下顺序和细节的。
其中$stk[top]$存修改的起止点;$last[]$存每次$extend()$前的$lst$值,用于路径回退上的$ch[x][c]$修改;$tag[]$表示点$i$这次操作新增点的数量,需要分为1,2讨论回退;$val[]$表示每次操作插入的字符$c$.
有2个新增点的$undo()$稍微复杂一点,这里$stk[]={从lst回退的p';fa[q];再次回退的p'';q}$.
#include<bits/stdc++.h>
const int maxn = ; int n,top,stk[maxn<<],last[maxn<<],tag[maxn<<],val[maxn<<];
long long ans;
struct SAM
{
int ch[maxn][],fa[maxn],len[maxn],lst,tot;
void init()
{
lst = tot = ;
}
void extend(int c)
{
int p = lst, np = ++tot;
last[++last[]] = lst;
lst = np, len[np] = len[p]+;
val[tot] = c;
for (; p&&!ch[p][c]; p=fa[p]) ch[p][c] = np;
tag[tot] = , stk[++top] = p;
if (!p) fa[np] = ;
else{
int q = ch[p][c];
if (len[p]+==len[q]) fa[np] = q;
else{
int nq = ++tot;
len[nq] = len[p]+;
tag[tot] = , val[tot] = c;
memcpy(ch[nq], ch[q], sizeof ch[q]);
stk[++top] = fa[q];
fa[nq] = fa[q], fa[q] = fa[np] = nq;
for (; p&&ch[p][c]==q; p=fa[p]) ch[p][c] = nq;
stk[++top] = p, stk[++top] = q;
}
}
ans += len[np]-len[fa[np]];
if (!tag[tot]) tag[tot] = ;
}
void undo()
{
if (tag[tot]==){
int p = last[last[]--], fnd = stk[top--], c = val[tot];
ans -= len[tot]-len[fa[tot]], lst = p;
for (; p!=fnd; p=fa[p]) ch[p][c] = ;
memset(ch[tot], , sizeof ch[tot]), --tot;
}else{
int q = stk[top--], fnd2 = stk[top--], fatq = stk[top--], fnd1 = stk[top--];
int p = last[last[]--], c = val[tot];
ans -= len[tot-]-len[fa[tot-]], lst = p;
for (; p!=fnd1; p=fa[p]) ch[p][c] = ;
fa[q] = fatq;
for (; p!=fnd2; p=fa[p]) ch[p][c] = q;
memset(ch[tot], , sizeof ch[tot]), --tot;
memset(ch[tot], , sizeof ch[tot]), --tot;
}
}
}f;
char s[maxn]; int main()
{
f.init();
scanf("%s",s+);
n = strlen(s+);
for (int i=; i<=n; i++)
{
if (s[i]=='-') f.undo();
else f.extend(s[i]-'a');
printf("%lld\n",ans);
}
return ;
}
做法二:后缀平衡树
具体的实现似乎可以用hash求LCP+multiset解决
END
【SAM】bzoj5084: hashit的更多相关文章
- 【SAM】codevs3160-最长公共子串
[题目大意] 求两个字符串的最长公共子串. [思路] 对第一个字符串建立后缀自动机,第二个字符串去匹配.cnt记录当前最长公共子串的长度,而ret记录答案. p代表位置指针,初始在rt位置. 对于第二 ...
- 【SAM】BZOJ2882-工艺
[题目大意] 求一个循环数列的最小表示法. [思路] 最小表示法的正解:★ SAM乱搞,和前面的POJ那道一样.然而MLE了,当作学习一下map的用法^ ^ map的使用方法(来源:☆) 一.map的 ...
- 【SAM】BZOJ3998-弦论
[题目大意] 给出一个字符串,求第k大的子串.(输入1表示子串可重复,0表示不可重复) [思路] 显然,k大子串是后缀自动机的经典题型,可以利用后缀自动机的性质来解决.对于字符串 [前铺1]" ...
- 【SAM】POJ1509-Glass Beads
[题目大意] 求一个循环数列的最小表示法. [思路] 把原创复制一遍放在后面,建立SAM,从s按字典序开始跑长度L即可. 板子来源(作者见连接内):
- 【SPOJ - LCS2】Longest Common Substring II【SAM】
题意 求出多个串的最长公共子串. 分析 刚学SAM想做这个题的话最好先去做一下那道codevs3160.求两个串的LCS应该怎么求?把一个串s1建自动机,然后跑另一个串s2,然后找出s2每个前缀的最长 ...
- 【SAM】loj#6401. 字符串
网上有篇题解写的是线段树合并维护求值? 题目描述 有一个只包含小写字母,长度为 $n$ 的字符串 $S$ .有一些字母是好的,剩下的是坏的. 定义一个子串 $S_{l\ldots r}$是好的,当且仅 ...
- bzoj 2946: [Poi2000]公共串【SAM】
对第一个串建SAM,把剩下的串在上面跑,每次跑一个串的时候在SAM的端点上记录匹配到这的最大长度,然后对这些串跑的结果取min,然后从这些节点的min中取max就是答案 注意在一个点更新后它的祖先也会 ...
- bzoj 4698: Sdoi2008 Sandy的卡片【SAM】
差分之后用SAM求LCS,然后答案就是LCS+1 #include<iostream> #include<cstdio> #include<cstring> usi ...
- bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡【SAM】
有一个显然的性质就是每个串一定在某个叶子为根的树中是一条直的链 然后因为SAM里是不会有相同状态的,所以以每个叶子为根dfs一遍,并且动态构造SAM(这里的节点u的last指向父亲),最后统计答案就是 ...
随机推荐
- P5346 【XR-1】柯南家族
题目地址:P5346 [XR-1]柯南家族 Q:官方题解会咕么? A:不会!(大雾 题解环节 首先,我们假设已经求出了 \(n\) 个人聪明程度的排名. \(op = 1\) 是可以 \(O(1)\) ...
- 【NOI2012】迷失游乐园
题目链接:迷失游乐园(BZOJ) 迷失游乐园(Luogu) 独立完成的题,写一发题解纪念一波~ 模拟完样例大概可以知道是道树形DP了. 观察数据范围,发现是基环树,至少会有一个环. 先从树的部分开始 ...
- 02.Jquery Mobile介绍以及Jquery Mobile页面与对话框
一.为什么要学Jquery Mobile JqueryMobile 是jquery的移动版本,懂基本的jquery知识,会简单的html+css就可以完成很多复杂的功能,还有就是这个框架在企业中用 ...
- 2、linux基础知识与技能
2.1.linux内核.发行版linux本身指的是一个操作系统内核,只有内核是无法直接使用的.我们需要的,可以使用的操作系统是一个包含了内核和一批有用的应用程序的一个集合体,这个就叫linux发行版. ...
- 事务的隔离级别和mysql事务隔离级别修改
A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...
- (办公)ssm发送邮件
1.添加jar包 <!-- Javamail API --> <dependency> <groupId>javax.mail</groupId> &l ...
- 高效的设计可视化UI
http://www.uimaker.com/uimakerdown/uitutorial/35990.html http://maqetta.org/downloads/ .Data.js Data ...
- 【复习笔记】HTML基础
编码 HTML LANG标注整体文档语言 常用编码:ASCII.GB2312.UTF-8 中文编码解决: 1.浏览器要用一个编码表去看你的文件<meta charset="utf-8& ...
- GIT新手入门学习教程
廖雪峰的GIT教程 链接地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- 【虚拟机-网络IP】虚拟机配置静态 IP 以后无法连接的解决办法
问题描述 将虚拟机内部 IP 地址从动态获取改成静态 IP 以后,远程连接失败. 问题分析 Azure 虚拟机的内部 IP 默认为动态分配, 由 DHCP 服务自动分配, 在虚拟机的生命周期内, 该 ...