【学习笔记】CF1817F Entangled Substrings(基本子串结构)

前置知识:基本子串结构,SAM的结构和应用

学长博客

字符串理论比较抽象,建议直观的去理解它

子串 t t t的扩展串定义为 ext(t) : = t ′ \text{ext(t)}:=t' ext(t):=t,满足 t t t t ′ t' t的子串,且 occ(t) = occ(t’) \text{occ(t)}=\text{occ(t')} occ(t)=occ(t’)

基本性质:若 t = [ l : r ] , t ′ = [ l ′ : r ′ ] t=[l:r],t'=[l':r'] t=[l:r],t=[l:r] t ′ ′ = [ l ′ ′ : r ′ ′ ] t''=[l'':r''] t′′=[l′′:r′′],使得 l ′ ≤ l ′ ′ ≤ l ≤ r ≤ r ′ ′ ≤ r ′ l'\le l''\le l\le r\le r''\le r' ll′′lrr′′r,则 ext(t”) = t ′ \text{ext(t'')}=t' ext(t”)=t

子串 x , y x,y x,y等价当且仅当 ext(x) = ext(y) \text{ext(x)}=\text{ext(y)} ext(x)=ext(y)。然后,记录每个等价类的最长串作为代表元。

s [ l : r ] ↦ ( l , r ) s[l:r]\mapsto (l,r) s[l:r](l,r)的作用下,在 y = x y=x y=x以上的点被等价类划分入若干个阶梯状集合,其中 g \text{g} g对应的阶梯 出现次数 occ(rep(g)) \text{occ(\text{rep(g)})} occ(rep(g))

对于等价类 g g g个某个 完整阶梯,其完整的一行对应的子串集合与 T 0 T_0 T0的某个结点对应的子串集合相同,其完整的一列对应的子串集合与 T 1 T_1 T1(反串对应的后缀树)某个节点对应的子串集合相同,并且一一对应。

定义等价类 g g g的周长为其 一个 完整阶梯的行数列数之和,性质: ∑ g per(g) = O ( n ) \sum_g\text{per(g)}=O(n) gper(g)=O(n)

比较抽象。不是很直观。

如何显式求出这个结构?

第一种方式:对于 T 0 T_0 T0的从父亲到儿子的树边,其从一行的左边界指向另一行的右边界;对于 T 1 T_1 T1的从父亲到儿子的树边,其从一行的上边界连向另一行的下边界。

例如, s = aababcd ‾ s=\underline{\text{aababcd}} s=aababcd,其对应的阶梯划分为:

请添加图片描述
其对应的 S A M SAM SAM T 0 T_0 T0为:

请添加图片描述

其对应的连边为:

请添加图片描述

第二种方式(感觉更常用):对于 D A G DAG DAG上的一条边 ( u , v ) (u,v) (u,v),如果 occ(u) = occ(v) \text{occ(u)}=\text{occ(v)} occ(u)=occ(v),那么就将这条边标记为关键边。

性质:如果只保留关键边,那么每个点入度和出度都至多为一,因此我们得到了若干条关键链。显然,链的末尾就是代表元,一条链就代表了一个等价类

考虑这道题目在让我们干什么:可以发现一个字符串对 ( b 1 , b 2 ) (b_1,b_2) (b1,b2)是好的当且仅当满足以下条件:

1.1 1.1 1.1 b 1 , b 2 b_1,b_2 b1,b2在同一个等价类中
1.2 1.2 1.2 b 1 , b 2 b_1,b_2 b1,b2所在等价类中的代表元为 b b b,那么 b 1 , b 2 b_1,b_2 b1,b2 b b b中出现的位置不交,且 b 1 b_1 b1 b 2 b_2 b2左边

这样,我们对于每个 阶梯状物 统计答案即可。(建议数形结合,以及把下标搞清楚)

代表元的 len \text{len} len实际上表示阶梯状物左上角那个位置的横纵坐标之差。

复杂度 O ( n ) O(n) O(n)

#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
using namespace std;
const int N=2e5+5;
struct node{int to[26],link,len,sz;
}t[N];
int n,cur,last,tot,sz[N];
void extend(int ch){int cur=++tot;t[cur].len=t[last].len+1,t[cur].sz=1;int p=last;while(p!=-1&&!t[p].to[ch]){t[p].to[ch]=cur;p=t[p].link;}if(p!=-1){int q=t[p].to[ch];if(t[q].len==t[p].len+1){t[cur].link=q;}else{int clone=++tot;t[clone].link=t[q].link;for(int i=0;i<26;i++)t[clone].to[i]=t[q].to[i];t[clone].len=t[p].len+1;while(p!=-1&&t[p].to[ch]==q){t[p].to[ch]=clone;p=t[p].link;}t[q].link=t[cur].link=clone;}}last=cur;
}
string str;
int nxt[N],vs[N];
int st[N],cnt;
ll s[N];
ll res;
vector<int>G[N];
void dfs(int u){for(auto v:G[u])dfs(v),t[u].sz+=t[v].sz;
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);t[0].link=-1;cin>>str,n=str.size();for(int i=0;i<n;i++)extend(str[i]-'a');for(int i=1;i<=tot;i++)G[t[i].link].pb(i);dfs(0);for(int i=1;i<=tot;i++){for(int j=0;j<26;j++){int k=t[i].to[j];if(k&&t[i].sz==t[k].sz)nxt[i]=k,vs[k]=1;}}for(int i=1;i<=tot;i++){if(vs[i]==0){cnt=0;int e=0;for(int j=i;j;j=nxt[j])e=j,st[++cnt]=t[j].len-t[t[j].link].len;for(int j=1;j<=cnt;j++)s[j]=s[j-1]+st[j];int p=1,len=t[e].len;for(int j=len-cnt+1;j<=st[cnt]&&j<=len+1;j++){while(p<=cnt&&st[p]<j)p++;res+=s[cnt-len+j-1]*(cnt-p+1);}}}cout<<res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148320.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

水浒传数据集汇总

很喜欢《水浒传》&#xff0c;希望能将它融入我的考研复习中&#xff0c;打算用水浒传数据来贯穿数据结构的各种知识&#xff0c;先汇总下找到的数据集 天池上看到的一个水浒传文本数据集&#xff1a;https://tianchi.aliyun.com/dataset/36027 Hareric/masterworkNLP: 基于社…

基于 SpringBoot 2.7.x 使用最新的 Elasticsearch Java API Client 之 ElasticsearchClient

1. 从 RestHighLevelClient 到 ElasticsearchClient 从 Java Rest Client 7.15.0 版本开始&#xff0c;Elasticsearch 官方决定将 RestHighLevelClient 标记为废弃的&#xff0c;并推荐使用新的 Java API Client&#xff0c;即 ElasticsearchClient. 为什么要将 RestHighLevelC…

【C语言】内存函数的详细教学和模拟实现

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是gugugu。希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f194;本文由 gugugu 原创 CSDN首发&#x1f412; 如需转载还请通知⚠…

【再识C进阶4】详细介绍自定义类型——结构体、枚举和联合

学习目标&#xff1a; 在上一篇博客中&#xff0c;我们已经详细地学习了字符分类函数、字符转换函数和内存函数。那这一篇博客和上一篇博客的关系不是那么相连。 这一篇博客主要介绍一下自定义类型&#xff0c;因为在解决实际问题时&#xff0c;由于世界上的因素有很多&#xf…

karmada v1.7.0安装指导

前言 安装心得 经过多种方式操作&#xff0c;发现二进制方法安装太复杂&#xff0c;证书生成及其手工操作太多了&#xff0c;没有安装成功&#xff1b;helm方式的安装&#xff0c;v1.7.0的chart包执行安装会报错&#xff0c;手工修复了报错并修改了镜像地址&#xff0c;还是各…

一文拿捏Spring事务之、ACID、隔离级别、失效场景

1.&#x1f31f;Spring事务 1.编程式事务 事务管理代码嵌入嵌入到业务代码中&#xff0c;来控制事务的提交和回滚&#xff0c;例如TransactionManager 2.声明式事务 使用aop对方法前后进行拦截&#xff0c;然后在目标方法开始之前创建或者加入一个事务&#xff0c;执行完目…

一键AI高清换脸——基于InsightFace、CodeFormer实现高清换脸与验证换脸后效果能否通过人脸比对、人脸识别算法

前言 AI换脸是指利用基于深度学习和计算机视觉来替换或合成图像或视频中的人脸。可以将一个人的脸替换为另一个人的脸,或者将一个人的表情合成到另一个人的照片或视频中。算法常常被用在娱乐目上,例如在社交媒体上创建有趣的照片或视频,也有用于电影制作、特效制作、人脸编…

MySQL5.7版本与8.0版本在CentOS系统安装

目录 前置要求 1. MySQL5.7版本在CentOS系统安装 1.1 安装 1.1.1 配置yum仓库 1.1.2 使用yum安装MySQL 1.1.3 安装完成后&#xff0c;启动MySQL并配置开机自启动 1.1.4 检查MySQL的运行状态 1.2 配置 1.2.1 获取MySQL的初始密码 1.2.2 登陆MySQL数据库系统 …

《Secure Analytics-Federated Learning and Secure Aggregation》论文阅读

背景 机器学习模型对数据的分析具有很大的优势&#xff0c;很多敏感数据分布在用户各自的终端。若大规模收集用户的敏感数据具有泄露的风险。 对于安全分析的一般背景就是认为有n方有敏感数据&#xff0c;并且不愿意分享他们的数据&#xff0c;但可以分享聚合计算后的结果。 联…

Python无废话-办公自动化Excel图表制作

openpyxl 支持用Excel工作表中单元格的数据&#xff0c;创建条形图、折线图、散点图和饼图等。 图表制作步骤 在openpyxl模块中创建图表&#xff0c;步骤如下: ①选择一个单元格区域&#xff0c;创建Reference 对象&#xff0c;作为图形数据a)(Value)。 ②创建一个Chart对象…

简单查找重复文本文件

声明这是最初 我的提问给个文本分类清单input查找文件夹下 .py .txt .excel .word 一模一样的文本不是找文件名 找相同格式下的文件文本是否一样 文件单独复制到文件夹下两个文件全部复制到文件夹下 print 打印相同文本文件的名字 比如查找到了3.py与4.5.是.py文件中的文本文件…

AtCoder Beginner Contest 233 (A-Ex)

A.根据题意模拟即可 B.根据题意模拟即可 C.直接用map 进行dp即可 D.用前缀和进行模拟&#xff0c;用map统计前缀和&#xff0c;每次计算当前前缀和-k的个数就是以当前点为右端点答案。 E - Σ[k0..10^100]floor(X&#xff0f;10^k) (atcoder.jp) &#xff08;1&#xff09;…

blender光照系统设置

0&#xff09;Viewport Shading设置里面的Lighting下面的参数&#xff1a; Scene Lights,Scene World - Scene Lights是指在渲染模式下是否使用场景中的灯光对象来照亮物体。 - Scene World是指在渲染模式下是否使用场景中的世界设置来作为背景和环境光。如果关闭该选项&#…

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测&…

springmvc中DispatcherServlet关键对象

以下代码为 spring boot 2.7.15 中自带的 spring 5.3.29 RequestMappingInfo 请求方法相关信息封装&#xff0c;对应的信息解析在 RequestMappingHandlerMapping 的 createRequestMappingInfo() 中实现。 对于 RequestMapping 赋值的相关信息进行解析 protected RequestMappi…

【AI视野·今日NLP 自然语言处理论文速览 第四十六期】Tue, 3 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 3 Oct 2023 (showing first 100 of 110 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Its MBR All the Way Down: Modern Generation Techniques Through the …

竞赛选题 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

Ubuntu22.04 交叉编译gcc9.5 for arm

一、准备 环境&#xff1a;ubuntu22.04为刚刚安装&#xff0c;未安装gcc等包 vi ~/.bashrc输入 export PATH$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin 保存,reboot 安装&#xff1a; sudo apt install cmake sudo apt install gawk sudo apt instal…

STM32复习笔记(五):FSMC连接外部SRAM

目录 Preface&#xff1a; &#xff08;一&#xff09;原理相关 &#xff08;二&#xff09;CUBEMX配置 &#xff08;三&#xff09;轮询方式读写 &#xff08;四&#xff09;DMA方式读写 Preface&#xff1a; STM32F4有一个FSMC&#xff08;Flexible Static Memory Contr…

mysql面试题11:讲一讲MySQL主从复制模式

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲MySQL主从复制模式? MySQL主从复制的配置步骤如下: 在主服务器上配置: 打开主服务器的配置文件my.cnf,启用二进制日志(binary log)功…