Jzoj2921【NOI2012模拟题】字符串识别

华为校招算法题第一题-回忆版 前言 华为春招数字化IT应用工程师岗位,笔试是三道编程题,第一题相对比较简单,偏爱考字符串。下面是对题目的回忆。 一、描述 对于输入的字符串,从左到右扫描字符串, 如果存在由三个以上(包括三个)连续相同字符组成的字串,就将这个子串从原串中去掉,并将原串剩下的部分拼接到一起。重复上述过程,直到无法去掉任何子串。如果所有的字符都被消除输出0。 例如: 输入:abbcccbd 输出:ad 输入:abbbaa 输出:0 我采取的是一种暴力解决法。即从头到尾遍历整个字符串,如果找到三个或者三个以上连续相同的字符,就把 阅读详情

题意:给一个字符串,对于每个位置i,求出最短满足的子串[l,r]使得i∈[l,r]且这个子串只出现一次,输出这个子串的长度

神(shui)题,AC后看了下别人的code发现全都是后缀数组(难看)

可能是因为我太弱了所以只想到SAM的算法

做法:建立SAM,求出parent树,预处理倍增,让后就可以O(lg n)查询一个字串的出现次数了


接下来,我们对于每个l∈[1,n],我们求出一个最小的r使得[l,r]在整个串里面只出现一次

那么对于每个点i,ans[i]有两种情况:

1.i被一个最短的区间[lj,rj]覆盖,那么我们可以

把这些l,r区间按长度从大到小排序,并且用线段树区间覆盖

2.有可能是一个区间[lj,rj](rj<i)的延伸[lj,i]

对于这种情况,我们把所有区间按r排序,对于i,我们用二分找到最大的j使得rj<i,让后答案就是i-max(l[k])(k<=j)

两种情况取较小就可以了

代码很长很丑,跑的也很慢。。。。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 1000010
#define f F[0]
using namespace std;
struct Pr{ int l,r; } R[N];
int F[20][N],s[N][26],mx[N],sz[N],d[N],M[N],n;
int v[N],r[N],m=1,cnt=1,last=1,A[N],pos[N],T[N<<2]; 
char str[N];
inline bool c1(Pr a,Pr b){ 
	return a.r==b.r?a.l>b.l:a.r<b.r; 
}
inline bool c2(Pr a,Pr b){ 
	return a.r-a.l>b.r-b.l;
}
inline int extend(char c,int& o){
	int p=last,np=last=o=++cnt,q,nq;
	c-='a'; mx[np]=mx[p]+1; sz[np]=1;
	for(;p&&!s[p][c];p=f[p]) s[p][c]=np;
	if(!p) return f[np]=1;
	q=s[p][c];
	if(mx[p]+1==mx[q]) f[np]=q;
	else {
		nq=++cnt;
		mx[nq]=mx[p]+1;
		f[nq]=f[q]; f[q]=f[np]=nq;
		memcpy(s[nq],s[q],26<<2);
		for(;p&&s[p][c]==q;p=f[p]) s[p][c]=nq;
	}
}
inline void build(){
	for(int i=1;i<=cnt;++i) ++v[mx[i]];
	for(int i=1;i<=n;++i) v[i]+=v[i-1];
	for(int i=cnt;i;--i) r[v[mx[i]]--]=i;
	for(int p,i=cnt;i;--i) sz[f[r[i]]]+=sz[r[i]];
	for(int p,i=1;i<=cnt;++i){
		p=r[i]; d[p]=d[f[p]]+1;
		for(int j=1;j<20;++j) F[j][i]=F[j-1][F[j-1][i]];
	}
}
int gSz(int l,int r){
	if(r>n) return 1;
	int x=pos[r];
	for(int p,i=19;~i&&sz[x]<=1;--i){
		p=F[i][x];
		mx[p]>=r-l+1?x=p:0;
	}
	return sz[x];
}
void cover(int l,int r,int x,int L,int R,int k){
	if(L<=l && r<=R){ T[x]=k; return; }
	if(T[x]){ T[x<<1]=T[x<<1|1]=T[x]; T[x]=0; }
	int mid=l+r>>1;
	if(L<=mid) cover(l,mid,x<<1,L,R,k);
	if(mid<R) cover(mid+1,r,x<<1|1,L,R,k);
}
int gCover(int l,int r,int x,int p){
	if(l==r) return T[x];
	if(T[x]){ T[x<<1]=T[x<<1|1]=T[x]; T[x]=0; }
	int mid=l+r>>1;
	if(p<=mid) return gCover(l,mid,x<<1,p);
	  else return gCover(mid+1,r,x<<1|1,p);
}
int main(){
	scanf("%s",str+1); n=strlen(str+1); 
	for(int i=1;i<=n;++i) extend(str[i],pos[i]);
	build(); int l=1,r=1;
	for(;l<=n;){
		for(;r<=n&&gSz(l,r)>1;++r);
		R[l]=(Pr){l,r};
		if(++l>r) ++r;
	}
	sort(R+1,R+1+n,c2); T[1]=n;
	for(int i=1;i<=n;++i) 
		if(R[i].r<=n) cover(1,n,1,R[i].l,R[i].r,R[i].r-R[i].l+1);
	for(int i=1;i<=n;++i) 
		A[i]=gCover(1,n,1,i);
	sort(R+1,R+1+n,c1); M[0]=-n;
	for(int i=1;i<=n;++i) M[i]=max(M[i-1],R[i].l);
	for(int i=1;i<=n;++i){
		l=0; r=n;
		for(int mid;l<r;){
			mid=l+r+1>>1;
			if(R[mid].r<=i) l=mid;
			else r=mid-1;
		}
		printf("%d\n",min(A[i],i-M[l]+1));
	}
}


html5 开心消消乐-类似连连看消除.rar html5 开心消消乐,具体玩法不说了,相认你会玩,手机上/电脑上都有这游戏,像连连看那样的消除游戏,没事的时候玩的休闲游戏,这个版本是由HTML5开发的,兼容手机和PC端,画面效果挺不错,具体效果请参见截图所示. 立即下载

相关推荐

【数据结构】汉诺塔问题(丰富图解)

经典汉诺塔问题,丰富图解,助你理解。

℉f的博客 4105

消除字符串中相邻的相同字符-Java

题目描述 给定一个字符串,从左到右扫描,如存在两个或两个以上的相同字符靠在一起,则消除这些字符。对每次消除后剩下的字符串,继续应用上述规则,直到不能消除为止。 输入 任意字符串 输出 消除后的字符串 样例 输入 abccbd 输出 ad 输入 snggnnqp 输出 sqp 代码 算法描述:准备一个栈A,将数据存入栈A之前,比较当前数据和栈顶元素是否相等,相等则将数据出栈,并且将出栈数据存到另一个栈B中,标记当前顺序;如果不等,则比较当前数据是否与另一个栈B顶的元素是否相等,是否有标记,相等则不入栈,不等,

Michael_Hu 5139

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 481

消去前后相同字符串

华为OD一面代码题:输入一个字符串:如ASSDFFDGDA,如果前后两个字符相同,可以消掉,消完变成ADDGDA,出现新的可以消掉的字符,继续消完变成AGDA。不再能消掉说明处理结束。 处理结束后字符串变为空,输出YES。字符串不空,输出NO #include<cstdio> #include<stack> using namespace std; int main() { string s; int i=0; cin>>s; st.

qq_41098987的博客 230

箱式连续提升机

箱式连续提升机,是对具有高度差较大(>1500mm)的输送线之间进行连接,将箱式物资进行连续输送的提升(或下降)的输送设备,可根据输送线的具体输送要求作相应的参数设计。目前的箱式连续提升机种类比较多,常用的形式主要有Z型和C型,工作原理相同,只是入口和出口分别在两侧和同侧。

月生沧溟 1248

Arcgis 10.3 与 ArcGIS Engine 10.3 安装与破解

Arcgis 10.3 与 ArcGIS Engine 10.3 安装与破解

weixin_52127098的博客 4724

Java获取相同字符串算法题,经典leetcode算法题分享(字符串)

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi前言很多人做leetcode题目找不到方向,或者说很难持之以恒,我这里推荐一种方法,从简单难度开始刷,刷完这个标签的简单难度,再换一个标签,这样循序渐进,把做题的量慢慢提高,还有难度逐渐加大。对于初学者,最重要是趁热打铁,而不是东打一枪西放一炮,趁热打铁才能形成做题的思路。还有一个问题是,一开始做题往...

weixin_29261711的博客 580

Buck的振铃实验与分析

上上期我们提到了buck电路的开关的振铃波形,本质原因是LC的阻尼振荡。文章偏理论,那BUCK到底是怎么产生尖峰振荡呢? 要想把这个问题搞清楚,也很是不容易,所以文章有点长,请直接点赞转发加收藏。 问题 本期主要分析以下这两个问题: 1、死区时间是什么?这里有个小台阶是什么情况? 2、上下尖峰振荡是如何产生的?跟哪些因素有关? 理想的BUCK的SW波形 我们由浅入深,一步一步来,先看理想的开关SW波形—没有尖峰电压的波形。 为了能更好的看buck电路各个点的电压电流情况.

weixin_42005993的博客 3万+

编写一种递归方法,它返回数N的二进制中表示1的个数。

/** * 编写一种递归方法,它返回数N的二进制中表示1的个数。利用这样一个事实:N为奇数,其1的个数为N/2的二进制中1的个数加1. * @author wulei * */public class BinaryTest { //Main method. public static void main(String[] args) { //For example ,m...

weixin_30323631的博客 250

Qwen-Image(阿里通义千问)技术浅析(一)

Qwen-Image(阿里通义千问多模态模型)是阿里巴巴推出的视觉-语言多模态大模型,能够理解图像内容并完成复杂的跨模态任务。

m0_75253143的博客 673

嵌入式数字信号处理器(DSP)高频面试题及参考答案

数字信号处理器(DSP)是一种专门设计用于执行数字信号处理任务的微处理器。它具有高度优化的架构,能够高效地执行复杂的数学运算,如快速傅里叶变换(FFT)、卷积、滤波和其他信号处理算法。DSP通常具有高速的中央处理器、专用的硬件乘法器、累加器、硬件循环支持和高速的内存访问能力,以满足实时信号处理的需求。通信:用于调制解调、语音编码、数据压缩、加密和解密。音频处理:如音乐合成、音效增强、语音识别和语音合成。视频和图像处理:包括图像压缩、视频编码、图像增强和模式识别。生物医学工程。

大模型大数据攻城狮的专栏 5266

递归实现数N的二进制表示

实现递归方法,使它返回数N的二进制表示中的1的个数。(如果N是奇数,那么N的二进制表示中的1的个数为N/2的二进制表示的1的个数加1)。实现见文章最后。  数据结构和算法(Java语言描述)的第一章课后题。 先简化思路,可以先用递归实现数N的二进制表示,先用字符串类型,再用String进行字符对比获取二进制表示中1的个数。 根据数N的获取二进制表示的算法(除2取余,并将余数倒序排列)实现二进制表示

Lex 的博客 1665

一、DMSP/OLS、NPP/VIIRS等夜间灯光数据能源碳排放空间化理论介绍

利用DMSP/OLS、NPP/VIIRS等夜间灯光数据开展能源碳排放空间化之前,需要区分与利用夜间灯光数据GDP空间化,两者操作流程并无较大区别,只是GDP空间化选择夜间灯光指数种类有比较多包括总灯光指数、平均灯光指数、综合灯光指数等,但是能源碳排放过程中通常只选择总灯光指数,其次能源碳排放空间化可能对于某些省份工业相对没有那么发达的区域,构建模型时候拟合效果比较差,也就是R方低一些或者显著性差。针对上述拟合度低的情况诸多学者前辈从多个方面开展研究进行提升。

端木宛白的博客家园 4924

jzoj2921. 【NOI2012模拟题】字符串识别(string) & jzoj4372. 【GDOI2016模拟】识别子串 (SAM优化)

题目描述 (其实两道题就是数据范围不一样) Description XX 在进行字符串研究的时候,遇到了一个十分棘手的问题。在这个问题中,给定一个字符串 S,与一个整数 K,定义 S 的子串 T=S(i, j)是关于第 K 位的识别子串,满足以下两个条件: 1、i≤K≤j。 2、子串 T 只在 S 中出现过一次。 例如,S=”banana”,K=5,则关于第 K 位的识别子串有”nan...

某司机的黑车 515

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2018欢聚时代校招编程题 字符串连连看

题目描述 对于输入的字符串,从左到右扫描字符串,如果存在由三个以上(包括三个)连续相同字符组成的子串,就将这个子串从原串中去掉,并将原有字符串剩下的部分拼接到一起。重复上述过程,直到无法去掉任何子串 输入描述: 输入的字符串 输出描述: 最后剩下的子串 示例1 输入 AAABCCDDDCB 输出 BB 说明 这道题目有点问题,是出现三次就删除,不是三次以上。 ...

wwxy1995的博客 1777

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[华为面试题]删除字符串中相邻的相同字符

给定一个字符串,从左往右扫描,如存在两个或两个以上的相同字符靠在一起,则消除这些字符。对每次消除后剩下的字符,继续应用上述规则,直到不能再消除为止。 示例: 输入:abccbd 返回:ad 消除:cc、bb 输入:snggnngp 返回:sgp 消除:gg 、nnn #include<iostream> #include<string> #include<stack> using namespace std; int main() { string s = "sn

qq_41221520的博客 2198

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

测试笔试内容1

笔试题

Habc5050的博客 447

工具增强型智能体:实现闭环优化与仿真建模的自动化编排

在人工智能与工程实践交叉领域,大语言模型驱动的智能体(Agent)正成为连接认知与执行的关键技术。其核心原理在于将模型的逻辑推理能力与专业工具的执行功能相结合,形成感知-决策-执行的闭环系统。这一架构的技术价值在于突破了传统自动化脚本的局限,实现了基于实时反馈的动态规划与调整,从而显著提升复杂工程任务的探索效率与自动化水平。在应用场景上,该技术特别适用于需要多工具协作的领域,如芯片设计中的参数优化、流体力学仿真校准、药物分子筛选等,通过智能编排仿真软件、优化算法与建模工具,将工程师从重复性操作中解放出来。本

weixin_30345577的博客 448

BZOJ2865 字符串识别

传送门 题意: XX在进行字符串研究的时候,遇到了一个十分棘手的问题。 在这个问题中,给定一个字符串S,与一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件: 1、i≤K≤j。 2、子串T只在S中出现过一次。 例如,S=“banana”,K=5,则关于第K位的识别子串有"nana",“anan”,“anana”,“nan”,“banan"和"banana”。 现在,...

dogeding233 334

数据结构与算法分析笔记与总结(java实现)--字符串1:字符串的排列(*)

数据结构与算法分析笔记与总结(java实现)--字符串1:字符串的排列(*)

小菜鸟也想飞的博客 611

Java字符串:replaceFirst() 方法

Java replaceFirst() 方法 replaceFirst() 方法使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串。 语法 public String replaceFirst(String regex,String replacement) 参数 regex — 匹配此字符串的正则表达式。 replacement — 用来替换第一个匹配项的...

Mr_chen的博客 1946

Python笔试题记录——字符串类笔试题自记

目录 字符串距离 思路整理 完整代码 字符串提取 思路自记 计算重复字符串长度 思路自记 字符串连连看 思路自记 字符串匹配 思路自记 完整代码 字符串类笔试题总结 字符串距离 给出两个相同长度的由字符 a 和 b 构成的字符串,定义它们的距离为对应位置不同的字符 的数量。如串”aab”与串”aba”的距离为 2;串”ba”与串”aa”的距离为 1;串”baa”和串...

恋蛩音的博客 1363

[JZOJ3975] 串

Description给定nn个字符串,询问每个字符串SiS_i有多少子串(不包括空串)是所有nn个字符串中至少kk个字符串的子串。n,∑Si≤105n,\sum S_i\le 10^5Analysis(SAM)首先所有串之间连个符号,一起建个SAM。 然后枚举每一个串,把它所有的子串所在的状态的出现次数+1。 就是parentparent树上rootroot到它所有状态+1,但是这样在一个串中

My Stage 851
上一篇: Jzoj2756 Longge的问题
下一篇: Jzoj2934 字符串函数
扩展的灰
博客等级 码龄12年 60粉丝 342原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值