网上有篇题解写的是线段树合并维护求值?

题目描述

  有一个只包含小写字母,长度为 $n$ 的字符串 $S$ 。有一些字母是好的,剩下的是坏的。

  定义一个子串 $S_{l\ldots r}$是好的,当且仅当这个子串包含不超过 $k$ 个坏的字母。

  求有多少个不同的满足以下要求的字符串 $T$ :

  • $T$ 作为 $S$ 的子串出现过。
  • 存在一个 $T$ 出现的位置 $[l,r]$ ,满足 $S_{l\ldots r}$​ 是好的。

输入格式

  第一行有一个字符串 $S$ 。

  第二行有一个字符串 $B$ 。若 $B_i=‘1’$ 则表示 $S_i$​ 是好的,否则表示 $S_i$ 是坏的。

  第三行有一个整数 $k$ 。

输出格式

  一个整数:答案。

数据范围与提示

  子任务 $1$($10$ 分):$n\leq 10$。

  子任务 $2$($10$ 分):$n\leq 100$。

  子任务 $3$($10$ 分):$n\leq 1000$。

  子任务 $4$($10$ 分):$n\leq 100000,k=n$。

  子任务 $5$($10$ 分):$n\leq 100000,k=0$。

  子任务 $6$($20$ 分):$n\leq 100000$,若$S_i=S_j$​,则$B_i=B_j$​。

  子任务 $7$($30$ 分):$n\leq 100000$。

  对于 $100\%$ 的数据:$1\leq n\leq {10}^5,0\leq k\leq {10}^5$, $S$ 只包含小写字母。

  题目来源:全是水题的GDOI模拟赛 by yww


题目分析

定位:比较模板的SAM题(然而我一个月前并不会SAM)

题意即求满足一定条件的若干个字符串里本质不同的子串个数。当然这里的“一定条件”比较特殊,是连续的一段子串。(如果这里的“一定条件”字符串是若干个互不相干的串,似乎就需要“广义后缀自动机”来处理了)

既然对于每一个新增的节点,其合法的子串都有一个左边界,那么在SAM里处理的时候,就可以对每一节点加一个权值$mx[u]$表示该节点的最长合法扩展长度。这个权值的作用就在于建完自动机后的$calc()$,原先数本质不同的子串个数是这样的: ans += len[p]-len[fa[p]]; 现在就是 ans += std::max(std::min(mx[p], len[p])-len[fa[p]], ); 。记得注意一下extend里对mx的转移。

 #include<bits/stdc++.h>
const int maxn = ; int n,lim,sum[maxn],size[maxn],cnt[maxn],pos[maxn];
long long ans;
struct SAM
{
int ch[maxn][],fa[maxn],len[maxn],mx[maxn],lst,tot;
void init()
{
lst = tot = ;
}
void extend(int c, int v)
{
int p = lst, np = ++tot;
lst = np, len[np] = len[p]+, mx[np] = v; //len[p+1] Here  居然打成标红的这个
for (; p&&!ch[p][c]; p=fa[p]) ch[p][c] = np;
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]+, mx[nq] = mx[q];
memcpy(ch[nq], ch[q], sizeof ch[q]);
fa[nq] = fa[q], fa[q] = fa[np] = nq;
for (; p&&ch[p][c]==q; p=fa[p])
ch[p][c] = nq;
}
}
}
void calc()
{
for (int i=; i<=tot; i++) ++cnt[len[i]];
for (int i=; i<=tot; i++) cnt[i] += cnt[i-];
for (int i=; i<=tot; i++) pos[cnt[len[i]]] = i, --cnt[len[i]];
for (int i=tot; i; i--)
{
int p = pos[i];
mx[fa[p]] = std::max(mx[fa[p]], mx[p]);
ans += std::max(std::min(mx[p], len[p])-len[fa[p]], );
}
}
}f;
char s[maxn],t[maxn]; int main()
{
scanf("%s%s%d",s+,t+,&lim);
n = strlen(s+);
f.init();
for (int i=, j=; i<=n; i++)
{
sum[i] = (t[i]=='')+sum[i-];
while (sum[i]-sum[j] > lim) ++j;
f.extend(s[i]-'a'+, i-j);
}
f.calc();
printf("%lld\n",ans);
return ;
}

END

【SAM】loj#6401. 字符串的更多相关文章

  1. LOJ #6031 字符串

    Description Solution 当 \(k\) 值较小时,发现询问串比较多,串长比较小 然后对 \(Q\) 个询问区间离线跑莫队,一次考虑每一个区间的贡献 假设一个区间 \([i,j]\) ...

  2. bzoj 2555 SubString(SAM+LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2555 [题意] 给定一个字符串,可以随时插入字符串,提供查询s在其中作为连续子串的出现 ...

  3. 后缀自动机SAM学习笔记

    前言(2019.1.6) 已经是二周目了呢... 之前还是有一些东西没有理解到位 重新写一下吧 后缀自动机的一些基本概念 参考资料和例子 from hihocoder DZYO神仙翻译的神仙论文 简而 ...

  4. 后缀自动机(SAM)奶妈式教程

    后缀自动机(SAM) 为了方便,我们做出如下约定: "后缀自动机" (Suffix Automaton) 在后文中简称为 SAM . 记 \(|S|\) 为字符串 \(S\) 的长 ...

  5. CodeForces 235C Cyclical Quest(后缀自动机)

    [题目链接] http://codeforces.com/contest/235/problem/C [题目大意] 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数,圆环匹配的意思是 ...

  6. 十二省联考 - JLOI2019 游记

    十二省联考 - JLOI 2019 游记 想了想,还是起一个副标题吧 一场失败的胜利 Day -inf 想了想,还是从头开始说吧. 其实考完NOIP之后,大概估算一下,吉林省队的数量还算是比较乐观的, ...

  7. LG3975 [TJOI2015]弦论

    题意 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在< String theory>中看到了这样一道问题:对于一个给定的长度为n的字符串,求出它的第k小子串是什么.你能帮帮她吗? ...

  8. [USACO5.5]Hidden Password

    题目大意: 求字符串最小表示. 思路: 本来按照lbn187的课件,知道SAM可以求字符串最小表示. 然而他并没有提供例题,就自己找了一道做. 大体思想就是把字符串复制一遍接在后面,构建SAM,然后每 ...

  9. Golang教程:常量

    定义常量 常量(constant)表示固定的值,比如:5,-89,"I love Go",67.89 等等. 考虑如下程序: var b string = "I love ...

随机推荐

  1. HTML5新标签介绍

    一.Datalist 标签 <input list="browsers"> <datalist id="browsers">   < ...

  2. 6.Python初窥门径(小数据池,集合,深浅拷贝)

    Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的 ...

  3. C# 操作 Excel 文件(.xls 或 .xlsx)

    在.net中,常用的操作excel文件的方式,有三种: OLE DB的形式, 第三方框架NPOI, Office组件. 总结: 通过对比,在读取大数据量的excel文件,建议用OLE DB的形式,把e ...

  4. shell 经典

    使用新写法 这里的新写法不是指有多厉害,而是指我们可能更希望使用较新引入的一些语法,更多是偏向代码风格的,比如 尽量使用func(){}来定义函数,而不是func{} 尽量使用[[]]来代替[] 尽量 ...

  5. SSIS-Dtsx包文件打开时一直验证

    把每个项的DelayValidation设置为true. 也可以直接改文件: 把文件里的 <DTS:Property DTS:Name="DelayValidation"&g ...

  6. OpenCV图像处理之 Mat 介绍

    我记得开始接触OpenCV就是因为一个算法里面需要2维动态数组,那时候看core这部分也算是走马观花吧,随着使用的增多,对Mat这个结构越来越喜爱,也觉得有必要温故而知新,于是这次再看看Mat. Ma ...

  7. 序列化流与反序列化流,打印流,工具类commons-IO

    1序列化流与反序列化流 用于从流中读取对象的操作流 ObjectInputStream    称为 反序列化流 用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流 特 ...

  8. zuul prefix

    经过测试,书上应该是写错了,如果要全部的路由加前缀,需要将zuul.stripPrefix=true进行设置 而不是书上所说的false

  9. AngularJS(一):概述

    本文也同步发表在我的公众号“我的天空” 在我们之前学习的前端代码编写过程中,总是通过HTML与CSS来进行页面布局,而使用JS来控制页面逻辑,因此,我们习惯于在JS中来操作页面元素,如以下代码,我们希 ...

  10. centos 安装 rtmp nginx 视频流服务器

    ---恢复内容开始--- 1.使用yum安装git yum -y install git 2.下载nginx-rtmp-module,官方github地址 // 通过git clone 的方式下载到服 ...