8.26 T4 日记和编辑器(fhq维护kmp——kmp本身含有的单射与可合并性)

http://cplusoj.com/d/senior/p/NOD2301D

前4个操作拿fhq treap是很好维护的。

对于最后一个操作,我们可以这么思考,从kmp的匹配思路出发:

如果我们知道一个串进入的指针 j j j(也就是kmp匹配到的位置),我们是可以直接预处理得到出来的 j ′ j' j 的。

而这个东西是非常好pushup的!我们直接按照左、中、右的顺序就行了。

然后就做完了

#include<bits/stdc++.h>
using namespace std;
#ifdef LOCAL#define debug(...) fprintf(stdout, ##__VA_ARGS__)#define debag(...) fprintf(stderr, ##__VA_ARGS__)
#else#define debug(...) void(0)#define debag(...) void(0)
#endif
//#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define fi first
#define se second
//#define M
//#define mo
#define N 1000010
int n, m, i, j, k, T, rt, Len;
char s[N], str[30], Ps[N]; 
int Q, c, u, fail[30]; 
int Gr[30][30], Fr[30][30]; struct FHQ_treap {int pri[N], w[N], a[N], cnt[N][30], f[N][30], g[N][30]; int ls[N], rs[N], tot; void push_up(int k) {int i; w[k] = 1 + w[ls[k]] + w[rs[k]]; for(i = 1; i <= 26; ++i) cnt[k][i] = cnt[ls[k]][i] + cnt[rs[k]][i] + (a[k] == i); for(i = 0; i <= Len; ++i) {g[k][i] = 0; f[k][i] = i; if(ls[k]) g[k][i] += g[ls[k]][f[k][i]], f[k][i] = f[ls[k]][f[k][i]]; g[k][i] += Gr[a[k]][f[k][i]]; f[k][i] = Fr[a[k]][f[k][i]]; if(rs[k]) g[k][i] += g[rs[k]][f[k][i]], f[k][i] = f[rs[k]][f[k][i]]; }}int merge(int x, int y) {if(!x || !y) return x + y; if(pri[x] < pri[y]) {rs[x] = merge(rs[x], y); push_up(x); return x; }else {ls[y] = merge(x, ls[y]); push_up(y); return y; }}void split(int k, int lim, int &x, int &y) {if(!k) return x = y = 0, void(); if(w[ls[k]] + 1 > lim) {y = k; split(ls[k], lim, x, ls[y]); }else {x = k; split(rs[k], lim - w[ls[x]] - 1, rs[x], y); }push_up(k); }int new_node(int c) {++tot; cnt[tot][c]++; w[tot] = 1; a[tot] = c; pri[tot] = rand(); for(int i = 0; i <= Len; ++i) f[tot][i] = Fr[c][i], g[tot][i] = Gr[c][i]; return tot; }void print(int x) {if(!x) return ; print(ls[x]); printf("%c", (char)(a[x] + 'a' - 1)); print(rs[x]); }
}fhq;signed main()
{#ifdef LOCALfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endif
//	srand(time(NULL));
//	T=read();
//	while(T--) {
//
//	}Q = read(); scanf("%s", Ps + 1); Len = strlen(Ps + 1); for(i = 1; i <= Len; ++i) Ps[i] = Ps[i] - 'a' + 1; for(i = 2; i <= Len; ++i) {u = fail[i - 1]; while(u && Ps[u + 1] != Ps[i]) u = fail[u]; if(Ps[u + 1] == Ps[i]) ++u; fail[i] = u; }for(i = 1; i <= Len; ++i) debug("%d ", fail[i]); debug("\n"); for(c = 1; c <= 26; ++c) for(i = 0; i <= Len; ++i) {u = i; while(u && Ps[u + 1] != c) u = fail[u]; if(Ps[u + 1] == c) ++u; Fr[c][i] = u; Gr[c][i] = (u == Len);if(Fr[c][i]) debug("(%c %d) %d %d\n", c + 'a' - 1, i, Fr[c][i], Gr[c][i]); }while(Q--) { int x, y, z, l, r; scanf("%s", str); if(str[0] == 'D' || str[0] == 'R') {l = read(); r = read(); fhq.split(rt, r, y, z); fhq.split(y, l - 1, x, y); rt = fhq.merge(x, z); }if(str[0] == 'I' || str[0] == 'R') {if(str[0] == 'I') j = read(); else j = l - 1; fhq.split(rt, j, x, y); z = 0; scanf("%s", s + 1); m = strlen(s + 1); for(i = 1; i <= m; ++i) {k = fhq.new_node(s[i] - 'a' + 1); z = fhq.merge(z, k); }
//			fhq.print(x); debug("\n"); 
//			fhq.print(y); debug("\n"); 
//			fhq.print(z); debug("\n"); rt = fhq.merge(fhq.merge(x, z), y); }if(str[0] == 'C') {l = read(); r = read(); scanf("%s", s);fhq.split(rt, r, y, z); fhq.split(y, l - 1, x, y); printf("%d\n", fhq.cnt[y][s[0] - 'a' + 1]); rt = fhq.merge(fhq.merge(x, y), z); }if(str[0] == 'S') {l = read(); r = read(); fhq.split(rt, r, y, z); fhq.split(y, l - 1, x, y); printf("%d\n", fhq.g[y][0]); rt = fhq.merge(fhq.merge(x, y), z); }
//		fhq.print(rt); debug("| %d\n", fhq.w[rt]); }return 0;
}

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

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

相关文章

IT 行业的就业情况

当前&#xff0c;IT 行业的就业情况呈现出以下特点&#xff1a; 1. 需求持续增长&#xff1a;随着数字化转型的加速&#xff0c;各个行业对信息技术的依赖程度不断提高&#xff0c;推动了对 IT 人才的持续需求。特别是在云计算、大数据、人工智能、物联网等新兴领域&#xff…

MySQL:复合查询

MySQL&#xff1a;复合查询 聚合统计分组聚合统计group byhaving 多表查询自连接子查询单行子查询多行子查询多列子查询from子查询 合并查询unionunion all 内连接外连接左外连接右外连接全外连接 视图 MySQL 复合查询是数据分析和统计的强大工具&#xff0c;本博客将介绍如何使…

【WiFi主要技术学习2】

WiFi协议学习2 WiFi SPEC理解频段信道带宽协商速率安全与加密WiFi主要技术理解BP直接序列扩频(Direct Sequence Spread Spectrum,DSSS)BPSKQPSK正交幅度调制(Quadrature Amplitude Modulation,QAM)互补码键控(Complementary Code Keying,CCK)正交频分复用(Orthogonal…

Global Illumination_LPV Deep Optimizations

接上回&#xff0c;RSM优化技术介绍后&#xff0c;我们本部分主要看一下&#xff0c;光栅GI三部曲中的LPV&#xff0c;这个算法算是很巧妙了&#xff0c;算法思路基于RSM上拓展到世界空间&#xff0c;可以说很具学习和思考价值&#xff0c;之前也简单实现过Global Illumination…

利用session.upload_progress执行文件包含

1.session.upload_progress的作用&#xff1a; session.upload_progress最初是PHP为上传进度条设计的一个功能&#xff0c;在上传文件较大的情况下&#xff0c;PHP将进行流式上传&#xff0c;并将进度信息放在Session中&#xff08;包含用户可控的值&#xff09;&#xff0c;即…

Go 语言版本管理——Goenv

Go 语言版本管理——Goenv 命令安装 goenv安装和切换 Go 版本 goenv 是一个专门管理 Go 语言版本的工具。 命令 安装 goenv github-goenv git clone https://github.com/go-nv/goenv.git ~/.goenv echo export GOENV_ROOT"$HOME/.goenv" >> ~/.bash_profile…

CSAPP全书学习总结

CSAPP( 1.计算机系统漫游)学习笔记-CSDN博客 CSAPP&#xff08;第二章 信息的表示和处理&#xff0c;附上datalab解析_datalab调整数据位置-CSDN博客 CSAPP &#xff08;第三章&#xff1a;程序的机器级表示-CSDN博客

STM32嵌套向量中断控制器—NVIC

NVIC简介&#xff1a; NVIC&#xff0c;即Nested Vectored Interrupt Controller&#xff08;嵌套向量中断控制器&#xff09;&#xff0c;是STM32中的中断控制器。它负责管理和协调处理器的中断请求&#xff0c;是STM32中处理异步事件的重要机制。 NVIC提供了灵活、高效、可扩…

基于ssm的实习课程管理系统/在线课程系统

实习课程管理系统 摘 要 互联网的快速发展&#xff0c;给各行各业带来不同程度的影响&#xff0c;悄然改变人们的生活、工作方式&#xff0c;也倒逼很多行业创新和变革&#xff0c;以适应社会发展的变化。人们为了能够更加方便地管理项目任务&#xff0c;实习课程管理系统被人们…

python-变量声明、数据类型、标识符

一.变量 1.什么是变量 为什么需要变量呢&#xff1f; 一个程序就是一个世界&#xff0c;不论使用哪种高级程序语言编写代码&#xff0c;变量都是其程序的基本组成单位。如下图所示的sum和sub都是变量。 变量的定义&#xff1a; 变量相当于内存中一个数据存储空间的表示&#…

C语言刷题日记(附详解)(3)

一、选填部分 第一题: 以下的变量定义语句中&#xff0c;合法的是( ) A. byte a 128; B. boolean b null; C. long c 123L; D. float d 0.9239; 思路提示&#xff1a;观察选项时不要马虎&#xff0c;思考一下各种类型变量的取值范围&#xff0c;以及其初始化的形式是…

【并集查找 图论】2421. 好路径的数目

本文涉及知识点 C图论 LeetCode2421. 好路径的数目 给你一棵 n 个节点的树&#xff08;连通无向无环的图&#xff09;&#xff0c;节点编号从 0 到 n - 1 且恰好有 n - 1 条边。 给你一个长度为 n 下标从 0 开始的整数数组 vals &#xff0c;分别表示每个节点的值。同时给你…

easyExcel 导入时,校验每个单元格数据

目录 1、定义excel导入文件对应的数据接收类 2、定义属性转换器 3、定义数据解析监听器 4、解析文件 1、定义excel导入文件对应的数据接收类 package com.ruoyi.project.domain.dto;import com.alibaba.excel.annotation.ExcelProperty; import com.ruoyi.project.impot…

@antv/g6 业务场景:流程图

1、流程图是流经一个系统的信息流、观点流或部件流的图形代表。在企业中&#xff0c;流程图主要用来说明某一过程。这种过程既可以是生产线上的工艺流程&#xff0c;也可以是完成一项任务必需的管理过程。业务场景流程图如下&#xff1a; 2、绘制流程图的 Tips 流程图一般是用…

Vue -- 总结 02

Vue脚手架 安装Vue脚手架&#xff1a; 在cmd中安装(输入):npm install -g vue/cli 如果下载慢或下载不了&#xff0c;可以安装(cmd输入)淘宝镜像:npm config set registry https://registry.npmmirror.com 用命令创建Vue项目 在要创建的vue项目的文件夹里输入 cmd 回车 创…

基于Java的心灵治愈交流平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java语言&#xff1b;Spring Boot框架 工具&#xff1a;IDEA/Eclipse、Navicat 系统展示 首页 心…

学习资料销售平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;资料类型管理&#xff0c;学习资料管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;学习资料&#xff0c;购物车&#xff0c;…

QT实现电子相册

使用带有UI界面的QWidget实现电子相册 1、实现功能 1、定时器的使用&#xff0c;在当前页面的停止总时长。 2、显示当前时间 3、图片的上一张与下一张 4、图片的显示 5、进度展示、一共十张图片、进度条的初始值为10。 2、widget.h #ifndef WIDGET_H #define WIDGET_H#i…

【Java设计模式】收集参数模式:掌握高效参数处理

文章目录 【Java设计模式】收集参数模式&#xff1a;掌握高效参数处理一、概述二、收集参数设计模式的别名三、收集参数设计模式的意图四、收集参数模式的详细解释及实际示例五、Java中收集参数模式的编程示例六、何时在Java中使用收集参数模式七、收集参数模式在Java中的实际应…

【微信小程序】SpringBoot集成微信小程序(多小程序集成)

SpringBoot集成微信小程序 前言一、前置工作1、获取appId和appSecret核心参数 二、SpringBoot集成微信小程序1、引入pom依赖2、yml配置3、java代码文件3.1、Properties 配置类3.2 Configuration 服务类 4、使用示例4.1、获取登录后的session信息&#xff1a;openId4.2、获取当前…