HDU - 5421 Victor and String 在字符串的首尾添加字符

模型优化系列——模型剪枝/量化概述 模型优化目的:通过减少模型大小,提高推理速度等使模型成功部署在各个硬件中并实时有效运作。 阅读详情

题目:有n种操作,开始给你一个空串,给你4中操作

1 c  在字符串的首部添加字符c

2 c  在字符串的尾部添加字符c

3  询问字符中的本质不同的回文串的个数

4 询问字符串中回文串的个数

思路:last[0]表示首部的操作的位置,last[1]表示尾部的操作的位置

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f

const int MAXN = 200005, SIZE = 26;
struct Palindromic_Tree {
	int next[MAXN][SIZE];//next指针
	int fail[MAXN];//fail指针
	int cnt[MAXN];//表示节点i表示的本质不同的串的个数(建树时求出的不是完全的,最后Count()函数跑一遍以后才是正确的)
	int num[MAXN];//表示以节点i表示的最长回文串的最右端点为回文串结尾的回文串个数
	int len[MAXN];//len[i]表示节点i表示的回文串的长度
	int S[MAXN];//存放添加的字符 S[MAXN << 1]
//	int last;//指向上一个字符所在的节点,方便下一次add
	int n;//字符数组指针 //lbd, rbd
	int p;//节点指针
	int lbd,rbd;
	int last[2];//0表示在字符串的首部加上一个字符,1表示在尾部加上一个字符
	int NewNode(int l) {//新建节点
		for(int i = 0; i < SIZE; ++i)
			next[p][i] = 0;
		cnt[p] = num[p] = 0;
		len[p] = l;
		return p++;
	}
	void Init(int x) {//初始化
	/*	p = n = 0;
		NewNode(0); NewNode(-1);
		last = 0;
		S[n] = -1;//开头放一个字符集中没有的字符,减少特判*/
		p=0;
		NewNode(0); NewNode(-1);
		last[0] = last[1] = 0;
		memset(S, -1, sizeof(S));
		lbd = x; rbd = x - 1;//x是字符串的最大长度
		fail[0] = 1;
	}
	int GetFail(int x, int d) {//和KMP一样,失配后找一个尽量最长的
//		while(S[n - len[x] - 1] != S[n]) x = fail[x];
		if(d == 0) while(S[lbd + len[x] + 1] != S[lbd]) x = fail[x];
		else while(S[rbd - len[x] - 1] != S[rbd]) x = fail[x];
		return x;
	}
	int Add(int c, int d) {
		//S[++n] = c;
		if(d == 0) S[--lbd] = c; else S[++rbd] = c;
		int cur = GetFail(last[d], d);
	//	int cur = GetFail(last);//通过上一个回文串找这个回文串的匹配位置
		if(!next[cur][c]) {//如果这个回文串没有出现过,说明出现了一个新的本质不同的回文串
			int now = NewNode(len[cur] + 2);//新建节点
			fail[now] = next[GetFail(fail[cur], d)][c];//和AC自动机一样建立fail指针,以便失配后跳转
			next[cur][c] = now;
			num[now] = num[fail[now]] + 1;
		}
	//	last = next[cur][c];
	//	cnt[last]++;
        last[d]=next[cur][c];
		if(len[last[d]] == rbd - lbd + 1) last[d ^ 1] = last[d];
		return num[last[d]];
	}
	void Count() {
		for(int i = p - 1; i >= 0; --i)
			cnt[fail[i]] += cnt[i];
		//父亲累加儿子的cnt,因为如果fail[v]=u,则u一定是v的子回文串!
	}
}tree;
int main(){

    int n,op;
    char ch[10];
    while(~scanf("%d",&n)){
        tree.Init(n);
        LL ans=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&op);
            if(op==1){
                scanf("%s",ch);
                ans+=tree.Add(ch[0]-'a',0);
            }
            else if(op==2){
                scanf("%s",ch);
                ans+=tree.Add(ch[0]-'a',1);
            }
            else if(op==3){
                printf("%d\n",tree.p-2);
            }
            else{
                printf("%lld\n",ans);
            }
        }
    }
    return 0;
}


【人工智能】全面盘点国内AI九大模型:各擅胜场的智能先锋(豆包、文心一言、讯飞星火、通义千问、Kimi、智谱清言、腾讯元宝、秘塔、天工AI) 追求性价比与全能:选豆包,适合个人与中小企业日常使用;侧重中文创作与理解:选文心一言,文学与商业文案创作首选;需要专业语音交互:选讯飞星火,智能客服、车载场景必备;看重生态与多场景:选通义千问,适配电商、办公等企业需求;处理超长文本任务:选Kimi,文档分析、学术研究的利器;专注深度推理创作:选智谱清言,学术与创意写作的伙伴;依赖腾讯生态协同:选腾讯元宝,日常轻量需求的便捷之选;深耕法律学术领域:选秘塔,专业文本处理的权威工具;布局前沿技术体验:选天工AI,享受接近国际顶尖的智能服务。 阅读详情

相关推荐

(详细教程)opencv+pycharm+笔记本摄像头 做一个人脸识别

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 一、安装opencv-python 这里推荐使用pycharm直接安装opencv-python 打开文件——设置——python解释器——点击+号 搜索opencv-python,点击安装包,等待片刻即可安装好 检查是否安装好,新建一个项目输入以下代码,若无报错则安装好 import cv2 二、准备分类器 咱们使用opencv官方提供的分类器,包括面部识别,侧...

qq_52852432的博客 1万+

python数字要加引号吗_在python中如何快速地将一串字符串首尾加上双引号?

python初学者。现在想做一个打包的小任务。目标地址为:D:\py_backup_test\iu d然后将这个地址放在target_dir 里,并加上当前时间和后缀名:import osimport timeimport re# 1. 需要备份的文件与目录将被# 指定在一个列表中。# 例如在 Windows 下:source = ['"D:\\Disk F\\py-test\\back-test...

weixin_39950867的博客 1125

Obsidian免费同步全攻略:手把手教你用OneDrive+Remotely Save插件跨设备同步笔记

本文提供了一份详细的Obsidian免费同步方案指南,核心是利用OneDrive云存储与Remotely Save插件实现跨设备笔记同步。文章手把手教学,涵盖插件安装、OneDrive授权配置、桌面端与移动端的同步设置,并解答了常见问题,帮助用户在不依赖官方付费服务的情况下,构建稳定、自主的免费同步工作流。

bash7scripter的博客 849

JAVA在字符串中的指定字符前后插入字符串

今天工作上遇到一个需求,前端需要将搜索关键字标红,问了下前端大哥,大哥说需要在后端处理,在关键字前后插入样式,在string类没找到现成可调用的api,为此写了个方法进行处理。 ...

a_SaltedFish的博客 1万+

用python将dycom .dcm格式图像转换为nifti .nii

因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。

qq_41103479的博客 3609

保姆级教程:将YOLOv8模型封装成Docker镜像,集成到CVAT实现自动标注

本文提供了一份详细的保姆级教程,指导如何将YOLOv8模型封装成Docker镜像并集成到CVAT平台,实现自动化标注。通过环境配置、模型服务化封装、Docker镜像构建与优化、CVAT平台集成等步骤,帮助开发者高效完成计算机视觉项目的自动标注工作流,显著提升标注效率。

weixin_28692817的博客 412

字符串前后添加字符

y = dr2["years"].ToString().PadLeft(4, '0'); 例如:y="10" ; y.padleft(5,'8') -->y="88810" 转载于:https://www.cnblogs.com/linpengfeixgu/articles/1214129.html

weixin_30552811的博客 1156

伺服电机的位置控制模式:PP模式与CSP模式的比较

在轮廓位置模式下,上位机给定目标绝对位置(或相对位置)、速度、加速度等参数,伺服内部的轨迹发生器根据这些参数生成目标位置曲线指令,通过伺服驱动器内部实现三环控制(位置环、速度环、力矩环)。如果还不理解,不妨看看下面的类比:轮廓位置模式中,上位控制器对伺服电机说,我给你个位置,怎么去哪,走那条路,那是你自己的事,这个时候伺服电机是有自己的思想的。同期同步位置模式红,上位机控制器对伺服电机的管理就和 严格,除了告诉你目标位置,走那条路都是控制器说的算,伺服电机就是个没有灵魂的工具。重点关注,轮廓位置模式。

m0_49968063的博客 5799

【回文自动机】 HDU 5421 Victor and String

通道 题意:首尾加字符,询问多少个本质不同的回文串和多少个不同回文串 思路:标记即可,分别维护左右last指针 代码: #include <cstdio> #include <cstring> typedef long long ll; template <class T> inline bool rd(T &ret) ...

139

BF8815A

了解ADBMS1818芯片的人会发现,这款BF8815B和1818有着很多相似的东西,当你了解其中一款AFE之后,另一款你的上手也会特别快,下面文章是我针对1818梳理的一些重要知识点,此篇文章主要讲解BF8815B的一些差异点。

m0_61973119的博客 561

37、半导体硅材料中的缺陷与吸杂技术解析

本文系统解析了半导体硅材料中的缺陷形成机制及其对电子器件性能的影响,重点探讨了生长和工艺诱导缺陷、表面与内部微缺陷的起源与特征。文章详细阐述了吸杂技术的原理、过程及在集成电路和太阳能电池制造中的应用,强调通过氧行为调控和热处理优化实现缺陷控制。同时介绍了吸杂效果的评估方法,并展望了未来新型吸杂技术的发展趋势,为提升半导体器件性能和制造良率提供理论支持和技术路径。

mongodb5scout的博客 162

hdu5421 Victor and String【回文树】

题目大意: 开始时给一个空字符串,要求支持在首尾加字符,询问本质不同的回文串个数和所有回文串个数。 解题思路: 很容易想到修改一下回文树的写法,从中间向两边拓展节点,本质不同的回文串个数就是回文树节点个数,而每加一个字母,增加的回文串个数就是num[last]。 注意到我们用了两个指针last[0],last[1]维护最长回文前(后)缀,所以在首(尾)添加字符后如果整个串变成了回文串,la...

cdsszjj的博客 270

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

本文介绍了如何将C#游戏开发中的代码从单个.cs文件拆分到多个.cs文件中,以提升代码的可维护性和可读性。文章演示了在Visual Studio中创建Hero类和ShowInfo类的具体步骤:通过右键项目名添加新建类,将原有代码分别剪切到对应的类文件中,并自动生成命名空间。拆分后需要在Program.cs中通过"using"指令引用这些类,最后通过运行测试验证功能正常。这种模块化代码组织方式能有效解决单一文件代码过长、结构混乱的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1135

Java基础:获取String字符串首尾字符,判断字符串首尾字符

String a1 = "Hello"; //获取字符串首尾字符 System.out.println(a1.charAt(0)); //H System.out.println(a1.charAt(a1.length()-1)); //o //判断字符串首尾字符 System.out.println(a1.startsWith("H")); //true System.out.print...

十_Java从入门到精通 5654

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 锁屏 相关源码待公开

c++在string末尾添加字符或字符串

1. += #include<iostream> using namespace std; int main() { string s = "1"; s += "2";//加在末尾 s = s + "3";//加在末尾 s = "4" + s;//加在头部 cout<<s; return 0; }//输出4123 2.append函数 #i...

WELCOME!!! 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java在字符串开头添加字符串_string - java:使用StringBuilder在开头插入

当我偶然发现这篇文章时,我有类似的要求。 我想要一种快速的方法来构建一个可以从双方增长的字符串,即。 在正面和背面任意添加新字母。 我知道这是一篇很老的帖子,但它激发了我尝试创建字符串的几种方法,我想我会分享我的发现。 我也在使用一些Java 8构造,它可以优化案例4和5的速度。[https://gist.github.com/SidWagz/e41e836dec65ff24f78afdf8669...

weixin_30647423的博客 6775

字符串头尾加上单引号

==> echo "test" | sed 1,$s//(.*/)///1//g             注意: { 1,$s//(.*/)/ } 这是第一部分                     { / }      这是第二部分                    { /1 } 这是第三部分                    { / }      这是第四

一步一步 2484

C++ string字符串末尾添加字符方法

1. 使用+连接 str = str+ 'a'; // or str += 'a'; 效率对比: str = str + 'a' 产生的是一个新的对象,再把结果返回 str += 'a' 涉及到的是对象的引用,返回引用,避免了产生新的对象 2. 使用append函数添加 str.append(1, 'a'); 使用的是append的函数重载,向string的后面加size_type _Count个字符value_type _Ch basic_string& append( size_typ

Yummy_Ou 1万+

HDU 5421 Victor and String(回文树)

Victor and String Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 524288/262144 K (Java/Others) Total Submission(s): 163Accepted Submission(s): 78 Problem Description Victor loves t...

weixin_30362801的博客 172

html 在body末尾追加,JavaScript在元素尾部追加字符串

JavaScript在元素尾部追加字符串属于前端实例代码,有关更多实例代码大家可以查看。应用中,可能需要在一个元素的末尾追加字符串,下面通过代码实例介绍一下如何实现。实现方式有两种,一种是追加文本节点,另一种通过innerHTML属性实现。如果要在字符串尾部追加参阅JavaScript 追加字符串一章节。一.追加文本节点:犀牛前端部落window.onload = () => {let tx...

weixin_42469706的博客 2838

linux shell 用sed命令在文本的行尾或行首添加字符

昨天写一个脚本花了一天的2/3的时间,而且大部分时间都耗在了sed命令上,今天不总结一下都对不起昨天流逝的时间啊~~~ 用sed命令在行首或行尾添加字符的命令有以下几种: 假设处理的文本为test.file 在每行的头添加字符,比如"HEAD",命令如下: sed 's/^/HEAD&/g' test.file 在每行的行尾添加字符,比如“TAIL”,命令如下: sed...

weixin_30814329的博客 5915

c++ string 末尾追加char字符

如果想在string s末尾追加abc   s = s + 'a' + 'b' + 'c'; //这样写是可以的 s += 'a' + 'b' + 'c'; //这样写是不对的 所以追加单个字符,可以一个个加,也可以用第一种方式一次性加~ 但不可以像第二种一样~      ...

柳婼 の blog 3万+

HDU 5421 Victor and String

Problem Description Victor loves to play with string. He thinks a string is charming as the string is a palindromic string. Victor wants to play n times. Each time he will do one of following

Occult 885

shell学习十二天----行与字符串

行V.S.字符串 大部分建议等程序都是处理输入数据的行,在这些情况下,不会有内嵌的换行字符出现在将要匹配的数据中,^与$则分别表示行的开头与结尾.   很多应用程序会将数据是位记录与字段的结合.一条记录指的是相关信息的翻个集合,例如以企业来说,记录可能含有顾客,供应商以及员工等数据,以学校来说,则可能有学生数据.而字段指的就是记录的组成部分,例如姓名或者街道地址.   linux鼓励使用

见证大牛成长之路的专栏 824
上一篇: HDU - 5157 Harry and magic string
下一篇: Gym - 100548G The Problem to Slow Down You
我不会额
博客等级 码龄11年 2粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值