【GDOI2019模拟2019.2.23】字符串

39文章解读与程序——EI\CSCD\北大核心《基于两阶段鲁棒优化算法的微网多电源容量配置》已提供下载资源 电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.《《《《《《《《更多资源还请持续关注本专栏》》》》》》》《《《《《《《《更多资源还请持续关注本专栏》》》》》》》论文与完整源程序_电网论文源程序的博客-优快云博客。电网论文源程序-优快云博客。 阅读详情

Description:

在这里插入图片描述
在这里插入图片描述

题解:

首先思考一个经典的问题怎么做?

就是求一个串的子串的不同子串数,这玩意儿冬令营上《字符串前沿算法》讲过。

考虑在把整个串的SAM建出来,注意建的时候记录每个结尾点。

然后一个一个把结尾点激活,之所以要先建出来的原因是树的形态就稳固了。

假设要查询[l…r]的不同子串数,先把r以前的结尾点激活。

如果知道每个点的rmax,这个点的深度代表的是[x…y],那么就给[rmax-y+1…rmax-x+1]+1,然后区间查询[l…r]即可知道不同子串数。

考虑如何动态维护这个东西。

顺序激活,假设这次激活点x,那么x到根的这一条链的rmax都会变成当前的i。

考虑用lct结构维护,在一棵splay的点是一条链,且这一条链的rmax相同。

用lct的access去更改rmax,因为一条链的深度是一段区间

lct的access的势能分析复杂度是O(nlogn)O(n log n)O(nlogn)的,所以总复杂度是O(nlog2n)O(n log^2n)O(nlog2n)

然后开始无聊的猜结论。

把s变成最小完整周期串,这个跑个KMP就行了。

现在要证明不可能有两个左端点∈[1…s]长度>=n的串是相同的。

长度大于可以n可以视为=n,这是一样的,因为这是一个循环串。

设左端点为i,j

不难得到对任意x都有s[x]=s[x+|i-j|]

如何必然有一个长度为gcd(|i-j|,n)的周期,与题设矛盾。

这个可以用周期定理解释。

那么只需要需要求3n以内的答案,超过3n的话每次答案加n。

Code:

#include<cstdio>
#include<cstring>
#include<vector>
#define db double
#define pp printf
#define ll long long
#define fo(i, x, y) for(int i = x, B = y; i <= B; i ++)
using namespace std;

const int N = 6e5 + 5;
 
char s[N]; int n;

int nt[N];

int son[N][26], FA[N], dep[N], la, tot;
void build() {
	fo(i, 1, tot) memset(son[i], 0, sizeof son[i]), FA[i] = 0;
	la = tot = 1;
}
#define push(v) dep[++ tot] = v
void add(int c) {
	int p = la;
	push(dep[p] + 1); int np = tot;
	for(; p && !son[p][c]; p = FA[p]) son[p][c] = np;
	if(!p) FA[np] = 1; else {
		int q = son[p][c];
		if(dep[p] + 1 < dep[q]) {
			push(dep[p] + 1); int nq = tot;
			memcpy(son[nq], son[q], sizeof son[q]);
			FA[nq] = FA[q]; FA[q] = FA[np] = nq;
			for(; son[p][c] == q; p = FA[p]) son[p][c] = nq;
		} else FA[np] = q;
	}
	la = np;
}

int ed[N];

int pl, pr, tt; ll px;
ll tr[N * 4]; int lz[N * 4];
#define i0 i + i
#define i1 i + i + 1
void down(int i, int x, int y) {
	if(lz[i]) {
		int m = x + y >> 1;
		tr[i0] += lz[i] * (m - x + 1); lz[i0] += lz[i];
		tr[i1] += lz[i] * (y - m); lz[i1] += lz[i];
		lz[i] = 0;
	}
}
void add(int i, int x, int y) {
	if(y < pl || x > pr) return;
	if(x >= pl && y <= pr) { tr[i] += (y - x + 1) * px, lz[i] += px; return ;}
	int m = x + y >> 1; down(i, x, y);
	add(i0, x, m); add(i1, m + 1, y);
	tr[i] = tr[i0] + tr[i1];
}
void ft(int i, int x, int y) {
	if(y < pl || x > pr) return;
	if(x >= pl && y <= pr) { px += tr[i]; return ;}
	int m = x + y >> 1; down(i, x, y);
	ft(i0, x, m); ft(i1, m + 1, y);
}

int t[N][2], pf[N], fa[N], rm[N];
int lr(int x) { return t[fa[x]][1] == x;}
void rotate(int x) {
	int y = fa[x], k = lr(x);
	t[y][k] = t[x][!k]; if(t[x][!k]) fa[t[x][!k]] = y;
	fa[x] = fa[y]; if(fa[y]) t[fa[y]][lr(y)] = x;
	fa[y] = x; t[x][!k] = y; pf[x] = pf[y]; rm[x] = rm[y];
}
int fl(int x) {
	return t[x][0] ? fl(t[x][0]) : x;
}
void splay(int x, int y) {
	for(; fa[x] != y; rotate(x)) if(fa[fa[x]] != y)
		rotate(lr(x) == lr(fa[x]) ? fa[x] : x);
}
void access(int x) {
	for(int y = 0; x; ) {
		splay(x, 0), fa[t[x][1]] = 0; rm[t[x][1]] = rm[x]; pf[t[x][1]] = x;
		
		int z = fl(x); if(x != z) splay(z, x);
		
		pl = rm[x] - dep[x] + 1; pr = rm[x] - (dep[FA[z]] + 1) + 1; px = -1;
		add(1, 1, 3 * n);
		
		t[x][1] = y; fa[y] = x; pf[y] = 0;
		y = x; x = pf[x];
	}
}

struct nod {
	int x, y, i;
} A;

vector<nod> a[N];

int Q, x, y, ax[N], ay[N], bx[N], by[N];
ll ans[N];

int main() {
	scanf("%s", s + 1); n = strlen(s + 1);
	{
		int x = 0;
		fo(i, 2, n) {
			while(x && s[x + 1] != s[i]) x = nt[x];
			x += s[x + 1] == s[i]; nt[i] = x;
		}
		if(n % (n - nt[n]) == 0) n = n - nt[n];
	}
	build();
	fo(ii, 1, 3) fo(i, 1, n) add(s[i] - 'a'), ed[(ii - 1) * n + i] = la;
	fo(i, 1, tot) pf[i] = FA[i];
	scanf("%d", &Q);
	fo(i, 1, Q) {
		scanf("%d %d", &x, &y);
		int z = (x - 1) / n;
		x -= z * n; y -= z * n;
		if(y <= 3 * n) {
			bx[i] = x; by[i] = y; A.i = i;
		} else {
			bx[i] = x; by[i] = x + 2 * n - 1; A.i = i;
		}
		A.x = bx[i]; A.y = by[i]; A.i = i;
		a[A.y].push_back(A);
		ax[i] = x; ay[i] = y;
	}
	fo(i, 1, 3 * n) {
		int x = ed[i];
		access(x); splay(x, 0); rm[x] = i;
		pr = i; pl = i - dep[x] + 1; px = 1;
		add(1, 1, 3 * n);
		fo(j, 0, a[i].size() - 1) {
			pl = a[i][j].x; pr = a[i][j].y; px = 0;
			ft(1, 1, 3 * n); ans[a[i][j].i] = px;
		}
	}
	fo(i, 1, Q) pp("%lld\n", ans[i] + (ll) (ay[i] - by[i]) * n);
	
}
Matlab实战:如何用MMG方程预测船舶轨迹(附完整代码) 本文提供了一份基于MMG方程的Matlab实战指南,详细讲解了如何从零构建船舶轨迹预测模型。内容涵盖MMG模型的核心原理、Matlab代码框架设计、动力学函数实现、参数调优与验证方法,并附有完整代码示例,帮助工程师和研究者快速掌握这一船舶操纵性预测的关键技术。 阅读详情

相关推荐

FOC无刷电机磁编码器机械角度与电角度自动对齐校准及电机极对数自动获取的方法

本文提出磁编码器机械角度与电角度自动对齐校准方法及电机极对数自动获取方案。通过通直流电流使转子定向,读取机械角度并计算电角度偏移量,实现精确对齐;同时利用低速旋转时检测反电动势过零点次数,结合机械角度变化量自动计算极对数。核心算法包括转子定向、偏移量计算、极对数推导等步骤,并提供了基于STM32的C语言实现代码。该方法适用于工业伺服、机器人等高精度控制场景,需注意负载安全、参数调整和误差处理。两种自动化流程可有效解决电机安装调试中的角度对齐和参数识别问题。

qq_29653575的博客 2488

【JZOJ 6028】【GDOI2019模拟2019.2.23】字符串

Description Solution 先考虑对一个串的子串求不同子串的个数怎么做, 先对询问离线, 考虑不断右移右端点,同时维护左端点为1~i的答案, 显然对于一种相同的子串,只计算最右边的, 在SAM中,一个节点代表了一些子串,而这些子串Right的最大值,也就是Fail树上这个点的所有儿子的Right最大值, 所以每次加入一个点,相当于更改一条链上点的Right最大值, 我发现这个就是L...

459

MoveIt2项目想换掉KDL求解器?试试这个trac_ik插件(附源码编译避坑指南)

本文详细介绍了如何在MoveIt2项目中用trac_ik插件替代KDL求解器,提升机械臂运动学求解的效率和成功率。内容涵盖环境准备、源码编译避坑、项目集成及性能调优,特别适合需要高精度控制的协作机械臂应用场景。通过实测数据对比,trac_ik在求解时间和奇异点处理上显著优于传统KDL求解器。

weixin_30730053的博客 698

c++leetcode题解

模板: #include <iostream> #include <sstream> #include <cstdlib> #include <cmath> #include <cstdio> #include <string> #include <iomanip> //cout<<fixed<&...

qq_38391187的博客 4388

模拟滤波器的基础知识和设计

使用Python实现多种模拟滤波器

faltas的博客 3530

MFC停靠窗口实战:CDockablePane从创建到控件布局的完整指南(附残影问题排查)

本文提供了MFC中CDockablePane停靠窗口的完整实战指南,涵盖从自定义窗格类创建、主框架集成、内部控件布局到高级功能定制的全过程。针对开发中常见的“残影”视觉问题,文章深入剖析了其根源,并给出了系统性的排查步骤与解决方案,帮助开发者构建稳定、专业的可停靠用户界面。

sun99的博客 614

将字符串’2019-02-05‘转换成2019年2月5日

formDate(){ let str = this.$user.userInfo.registerTime let year = str.split('-')[0] let month = str.split('-')[1] let date = str.split('-')[2] month = month.rep...

知其白,守其黑;和其光,同其尘。 3379

PID、模糊PID、SkyHook、LQR、H2/H∞、ADRC等悬架控制合集

PID、模糊PID、SkyHook、LQR、H2/H∞等悬架控制合集

Mr.邹的博客 2013

JZOJ 6030. 【GDOI2019模拟2019.2.25】白白的

Description Input Output Sample Input 4 3 6 0 10 1 1 2 1 0 1 2 Sample Output 1 1 0 Data Constraint Solution 先一遍归并排序算出初始答案。 对于 0 操作,我们需要计算改变的那一位对答案的贡献。 这个就是单点修改+区间查询比 x 大的数的个数,树状数组套权值线段树即可(动态...

Felix-Lee的博客 455

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

YOLOv4目标检测算法——通俗易懂的解析

YOLOv4目标检测算法——通俗易懂的解析

chase 7135

京东2019校招 笔试1:相似字符串

题目: 两字符串X与Y,如果存在a-z的某个排列组合,把X的第一个字符全换成a,第二个字符全换成b,就能把X变成Y,就表明两字符串相似。 例如 xax与 aba,把z替换成a,a换成b就一样了,表明相似。 求一个目标字符串X,用来匹配的字符串Y,求X的子串里有多少和Y相似的,输出相似字符串的个数。 输入是X和Y,输出个数 输入: ababcdcbbab xyx 输出: 4 思...

gsch_12的博客 824

SIWAVE仿真PCB操作说明

使用SIWAVE进行PCB仿真提取S参数的操作

sinat_15150363的博客 3068

[JZOJ6028]【GDOI2019模拟2019.2.23】字符串【SAM】【LCT】【线段树】

Description Solution 不妨先考虑subtask 2 即给出一个字符串S,动态询问[l,r]内本质不同的子串数。 有一个非常套路的做法(来自laofu的2018集训队论文): 考虑离线。先将这个字符串S的SAM建出来 对于SAM上的一个节点,贡献就是它在[l…r]出现的最后一次被l所截的长度。 我们将所有询问按右端点排序,从左到右扫r。 那么每次相当于在parent树上将一个...

Never give in. 490

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

GDOI 2025 游记

NGOI挂到队线了,感觉NGOI省队概率已经极小了,能否冲个A5?

pyx寄居地 860

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

GDOI2016第一次模拟总结 4.21 ~ 4.23

GDOI2016第一次模拟总结 4.21 ~ 4.23

YxuanwKeith的博客 1000

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【jzoj4982】【GDOI2017模拟2.23】【加密】【sam】

题目大意身为特工,Star的任务除了获取敌人的情报外,当然还包括传递己方的情报。考虑到利用数字进行运算的加密方式容易被破译,他想到了一个借助字母的加密法。现在有一个包含N个小写字母的字符串S,其下标从0开始。Star用下列方式得到它对应的密码:1、光标初始位于下标0处;2、当光标位于i时,找到一个最长的子串S[j … j + len - 1],满足j < i,使得S[i … i + len - 1]

inklutcuah’s blog 744

【GDOI 2016模拟4.23】闷声

题目描述给定一个长度为nn的字符串,以及mm个要求(l,r,v)(l, r, v),要求确定t0⋯tn−1t_{0}\cdots t_{n-1},要求ti∈[i,n]t_i\in [i, n],以最大化获益。其中受益如下给出: tit_i选择了jj会获得wi,jw_{i, j}的收益(已给定)。 若对于某个特定的要求,∀k∈[0,n),k+LCP(sufk,sl⋯r)≤ti\forall k\in[

Yves___的专栏 583

【GDOI2016模拟4.23】无界单词

Description学过kmp吗? 一个只由a和b组成的字符串S,如果next[|S|]=0,那么这个单词就是无界的,否则就是有界的。 给出n和k,求长度为n的无界单词有多少个,和其中字典序第k小的是什么。 多组询问。 Type<=50,n<=64Solution很考验思维的一道题。 一般人(我)看到就想到鬼畜数论,结果正解是dp(也不算吧)首先处理第一问。好像很难做 正难则反。 设

时光真疯狂, 我一路执迷于匆忙. 1116

【距离GDOI:137天】 扩展KMP...字符串QAQ

上次和黄神两人一合计,干脆我学字符串他学图论,然后两人相互教...但以蒟蒻最近这状态来看,估计会到时候也教不了QAQ 扩展KMP大概是下面这个课件讲的这样 http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 然后需要注意的是初始化问题: 对于next数组,根据定义next[0]=len ,而因为...

weixin_33849942的博客 95

【SAM】loj#6401. 字符串

网上有篇题解写的是线段树合并维护求值? 题目描述   有一个只包含小写字母,长度为 $n$ 的字符串 $S$ 。有一些字母是好的,剩下的是坏的。   定义一个子串 $S_{l\ldots r}$是好的,当且仅当这个子串包含不超过 $k$ 个坏的字母。   求有多少个不同的满足以下要求的字符串 $T$ : $T$ 作为 $S$ 的子串出现过。 存在一个 $T$...

weixin_30797027的博客 244

JZOJ4446. 【HNOI2016模拟4.14】B

分析通过观察样例,推理得出结论:改变之后的平方和更大。 认真分析改变两个数的意义: 就是将小的数二进制某些位的1移到大的那个数那里,然后这个位置变为0。 我们也知道,一个数越大,它的平方越大。我们只需要记录二进制下每一个位置一共有多少个1,然后每次取最大的数, 这样的答案一定是最优的。code#include <cstdio> #include <algorithm> #include <c

lijf2001的博客 468

Pulumi+TypeScript统一编排DigitalOcean与Kubernetes

基础设施即代码(IaC)的核心在于将云资源与Kubernetes集群视为可编程、可版本化、可协作的软件系统。其底层原理依赖于声明式定义、状态驱动执行与跨平台资源抽象,技术价值体现在变更可追溯、环境可复现、团队可协同。典型应用场景包括多环境一致部署、渐进式发布、混合云联邦管理及SRE自动化运维。本文聚焦使用Pulumi这一现代IaC工具,结合TypeScript强类型能力与异步编程优势,打通DigitalOcean云资源创建与Kubernetes原生对象编排之间的割裂,实现从Droplet到Ingress的端

weixin_30664051的博客 401

网易游戏2019 校招题 字符串缩写

题目: 如果字符串有连续个M(M&amp;amp;gt;=4)按字典递增顺序相邻的大写字母,则缩写为“首字母-结束字母” 输入: 2 ABCD XYABCDEFA 输出: A-D XYA-FA 这题目思路很简单。两版本思路完全一致,只是python比java少写20行代码而已。 但是网易游戏不给用python,于是只能原思路改成java了。 做法: 举例 X Y A B C D E...

gsch_12的博客 1429

[JZOJ6022]【GDOI2019模拟2019.2.15】求和【排列组合】【中国剩余定理】

Description Solution ∑i=0N∑j=0M[i,j&amp;nbsp;is&amp;nbsp;even](ij)\sum\limits_{i=0}^{N}\sum\limits_{j=0}^{M}[i,j\ is\ even]{i\choose j}i=0∑N​j=0∑M​[i,j&amp;nbsp;is&amp;nbsp;even](ji​) =∑j=0M[j&amp;nbsp;is&amp;nbsp;even]∑i=...

Never give in. 544

SNOI2019 字符串

题目描述: luogu 题解: 这题$O(n)$。 首先把连续的相同字符缩在一起。 然后考虑字典序的比较是从前向后一位一位比,所以: 当$a[i]>a[i+1]$时,删$a[i]$一定比删$a[j](j>i)$更优; 当$a[i]<a[i+1]$时,删$a[j]$一定比删$a[i]$更优。 然后深搜$O(n)$。 代码: #include&l...

a6t2007的博客 212
上一篇: 【GDOI2019模拟2019.2.23】签到
下一篇: JZOJ 幽幽子与森林
Cold_Chair
博客等级 码龄11年 158粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值