HDU3948 The Number of Palindromes

HDU3948:后缀数组+马拉车(本质不同回文子串统计) 题意:给出一个字符串,求其 本质不同的 回文子串的个数。 如果有小伙伴WA了无数次,请尝试模拟一下aabaa这个串,答案应该是5。(本菜鸡就WA了一晚上) 题解:回文子串可以考虑先来个O(n)的马拉车预处理,这样每个回文子串长度必然是计数,那么我们可以统计本质不同的(正中间的字符+右半边串)回文子串个数。然后可以考虑用后缀自动机统计答案。这道题的关键的关键在于去重的处理。去重要 阅读详情

传送门

题意:给出一个字符串,问你有多少个本质不同的回文子串。

题解:
理论上有3种做法,我只写了回文自动机和manacher。
这两个东西的坑我迟早会补上的

回文自动机:建完之后根据我抄的建树方法输出节点数-1即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define maxn 100005
using namespace std;
int t,n,la,ncnt,cnt[maxn];
struct node { int len,fail,ch[26];} tree[maxn];
char s[maxn];
void Init()
{
	memset(tree,0,sizeof(tree));
	tree[0].len=0,tree[1].len=-1,ncnt=1,la=0,tree[0].fail=1;
}
int Get(int i,int now)
{
	while(s[i-tree[now].len-1]!=s[i]) now=tree[now].fail;
	return now;
}
void Insert(int i)
{
	int t=Get(i,la),c=s[i]-'a';
	if(!tree[t].ch[c])
	{
		tree[++ncnt].len=tree[t].len+2;
		tree[ncnt].fail=tree[Get(i,tree[t].fail)].ch[c];
		tree[t].ch[c]=ncnt;
	}
	la=tree[t].ch[c];
	cnt[la]++;
}
int main() {
	scanf("%d",&t);
	for(int cas=1;cas<=t;cas++)
	{
		scanf("%s",s+1);
		n=strlen(s+1);
		Init();
		for(int i=1;i<=n;i++) Insert(i);
		printf("Case #%d: %d\n",cas,ncnt-1);
	}
}

manacher:每次进while时,当两端是特殊字符是hash一下丢到set里面去。好久没写hash了zz如我预处理幂的时候还没有写pw1[0]-pw2[0]=1wa了几次…

#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#define maxn 100005
#define maxm 26
#define P 131
#define LL unsigned long long
#define mod 998244353
using namespace std;
typedef pair<LL,LL> PLL; 
int T,p[maxn*2];
char s[maxn*2],t[maxn];
LL h1[maxn*2],h2[maxn*2],pw1[maxn*2],pw2[maxn*2];
set<PLL> st;
PLL HA(int l,int r)
{
	LL ha1=h1[r]-h1[l-1]*pw1[r-l+1];
	LL ha2=(h2[r]-h2[l-1]*pw2[r-l+1]%mod+mod)%mod;
	return PLL(ha1,ha2);
}
void manacher(int n)
{
	int id=0;
	for(int i=1;i<n;i++)
	{
		if(p[id]+id>i) p[i]=min(p[2*id-i],p[id]+id-i);
		else p[i]=1;
		while(s[i-p[i]]==s[i+p[i]])
		{ 
			p[i]++; 
			if((i+p[i]-1)%2) st.insert(HA(i-p[i]+1,i+p[i]-1));
		}
		if(id+p[id]<i+p[i]) id=i;
	}
}
void init()
{
	st.clear();
	memset(s,0,sizeof(s));
	memset(p,0,sizeof(p));
	memset(h1,0,sizeof(h1));
	memset(h2,0,sizeof(h2));
}
int main()
{
	scanf("%d",&T);
	pw1[0]=pw2[0]=1;
	for(int i=1;i<maxn*2;i++) pw1[i]=pw1[i-1]*P,pw2[i]=pw2[i-1]*P%mod;
	for(int cas=1;cas<=T;cas++)
	{
		scanf("%s",t);
		init();
		int len=strlen(t);
		int n=len*2+2;
		for(int i=0;i<len;i++) s[i*2+2]=t[i];
		s[0]=1,s[n]=2;
		h1[0]=h2[0]=1;
		for(int i=1;i<=n;i++) h1[i]=h1[i-1]*P+s[i],h2[i]=(h2[i-1]*P+s[i])%mod;
		manacher(n);
		printf("Case #%d: %d\n",cas,st.size());
	}
}

说句闲话:补文化课真是刺激惨了。

深入解析postcss-px-to-viewport-8-plugin:如何精准控制响应式转换范围 本文深入解析了postcss-px-to-viewport-8-plugin插件在响应式开发中的核心痛点——如何精准控制单位转换范围。针对插件默认全局转换的问题,文章提供了两种实战解决方案:通过编写巧妙的exclude正则表达式实现“曲线救国”,或直接修改插件源码补全include功能。同时,文章还分享了在Next.js、Vite等现代框架中的集成要点及常见问题排查方法,帮助开发者实现“外科手术式”的精准样式转换。 阅读详情

相关推荐

Unidbg逆向阿里系App签名:从环境补全到算法还原实战

在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算

weixin_42525738的博客 939

HDU 3948 The Number of Palindromes

The Number of Palindromes Time Limit: 3000ms Memory Limit: 262144KB This problem will be judged onHDU. Original ID:394864-bit integer IO format:%I64d Java class name:Main Now, yo...

weixin_30657999的博客 141

FANUC机器人电弧跟踪功能深度解析:从电流采样原理到ROBOGUIDE仿真避坑指南

本文深度解析FANUC机器人电弧跟踪技术,从电流采样原理到ROBOGUIDE仿真避坑指南,详细介绍了电流波形分析、实时补偿机制及现场调试技巧。针对工业焊接中的常见问题,提供从底层原理到高阶应用的解决方案,帮助工程师优化自动化焊接质量。

weixin_31785177的博客 551

求回文串个数

先整理各路大神的题解 Orz,以后再埋坑 SP7586 NUMOFPAL - Number of Palindromes Description 求一个串中包含几个回文串。 Input 输入一个字符串S Output 包含的回文串的个数. 思路一: 用马拉车求出预处理后以每个字母处的回文半径P[i],遍历一遍,ans=ans+P[i]/2,最终ans就是答案 答...

weixin_30299539的博客 666

STM32 超声波模块输入捕获测距(标准库)

通道2设置为下降沿触发,触发瞬间会将CNT的记录到CCR2中,由于上升沿触发时已经将CNT置零所以此时的CNT的值就是高电平的持续时间。通道1设置为上升沿触发,触发的瞬间会将CNT的值记录到CCR1里面,同时设置通道1触发带有从模式,并把从模式设置为置零CNT。超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应)。输入捕获原理可以看看这位大佬,感觉写的很清楚,工作电压与电流:5V,15mA。感测角度:不小于15度。

qq_62425900的博客 2082

【Clickhouse】Cannot allocate block number in Zookeeper write prefix view location

我有一个问题,我CK集群跑批的时候,replicated表变成只读的了下面是CK的报错和当时ZK的日志。下面是zk报错开始 我认为是写入的时候,压力太大,ZK扛不住了,就按照博客里的建议优化了ZK的参数,现在偶尔还会只读,zk报错都是图里的那种clickhouse的集群是5分片的集群,数据量比较大。每小时批量一次,每次2-10W条数据,字段的话,不到200个字段,使用的 jdbc sink写入。

九师兄 836

hdu 3948后缀树组-4

http://acm.hdu.edu.cn/showproblem.php?pid=3948  题意:求一个给定串所有不同的回文子串个数。。distinct palindrome。。   分析: 求一个串中不相同的子串个数是通过扫描一遍height数组,每次如果前面的he

xuanflyer 2320

使用LabVIEW创建和分析柱状图:从基础绘制到高级数据分析的完整指南

LabVIEW,全称为Laboratory Virtual Instrument Engineering Workbench,是由美国国家仪器公司(National Instruments, NI)开发的一款图形化编程语言。自1986年首次推出以来,LabVIEW凭借其强大的数据采集、分析和控制能力,在工程、科研、教育等领域得到了广泛应用。与传统的文本编程语言不同,LabVIEW采用了图形化编程方式,用户通过连接不同的函数节点来实现复杂的逻辑和算法。

qq_38334677的博客 775

【HDU3948】The Number of Palindromes(PAM)

问题是问本质不同的回文串的个数,回文树的模版题 代码: #include<iostream> #include<cstdio> #include<queue> #include<cstring> #define maxx 100005 #define N 26 using namespace std; typedef long long ll; st...

Coldfresh的博客 266

【Python百日进阶-Web开发-Feffery】Day385 -“一起Dash”训练营Lesson-07_利用fac构建表单(上)

文章目录前言:fac是什么?“人生苦短,我用Python;Web开发,首选Feffery!”↓↓↓ 今日笔记 ↓↓↓一、费老师课堂1.1 什么是表单1.2 页面效果1.3 课堂源码二、课后作业2.1 页面效果2.2 项目源码 前言:fac是什么? feffery-antd-components(简称fac),是国内大佬费弗里(Feffery)老师基于著名的React UI组件库ant design进行二次开发,将ant design中的诸多实用组件及特性引入Dash,帮助开发者使用极低的纯Python代

专注于医院数据分析技术与系统开发的创作与分享。 251

32、生物信息学中的符号、缩写及相关概念解析

本文详细解析了生物信息学中常用的符号、缩写及相关概念,涵盖概率理论、函数表示、模型结构、图与集合、维度参数、神经网络、隐藏马尔可夫模型、双向架构、语法系统、系统发育树、微阵列分析以及核方法与支持向量机等多个领域。通过表格和mermaid流程图的形式,系统梳理了各类符号的定义与应用场景,并介绍了常见缩写的全称与意义。文章旨在帮助研究人员准确理解生物信息学中的基础术语,提升对基因表达分析、序列建模、机器学习等技术的理解与应用能力。

rrr55的博客 146

HDU 3948 The Number of Palindromes(后缀数组)

题意:求一个串中不相同回文子串的个数。 做法:本来想用manacher。但是无法判重。只能利用后缀数组,按照求回文串常规做法,把原串翻转拼到原串后面,求出height,以及利用sparse table预处理。通过rank值的从小到大枚举回文串的中点(这里就说奇回文串,偶的大同小异),同时要保存之前算出的回文串长度(其实中心到右端)L,L = min(L, height[i])是当前求出回文串长度

glq007的acm的奋斗 738

《派出你的AI同事:WorkBuddy案例实战》067:按行业分类的案例索引

按行业分类的案例索引 —— 《派出你的AI同事:WorkBuddy案例实战》系列文章,配图已统一为规范示意图。

LuckyHanMo的博客 99

The Number of Palindromes HDU - 3948 (回文树)

题目 https://cn.vjudge.net/problem/HDU-3948 题意 求出本质不同的回文串个数。 思路 回文树 #include &lt;iostream&gt; #include&lt;bits/stdc++.h&gt; using namespace std; const int MAXN = 210005 ; const int N = 26 ; struct...

七九河开的博客 225

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

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

hdu 3948 The Number of Palindromes

后缀数组,求不同回文子串的数量 #include #include // hdu 3948 const int MAXN = 200010; int wa[MAXN], wb[MAXN], ws[MAXN], wv[MAXN]; int rank[MAXN], height[MAXN], r[MAXN], sa[MAXN]; inline int min(const int a, co

solotzg 913

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HDU 3948 The Number of Palindromes

Description Now, you are given a string S. We want to know how many distinct substring of S which is palindrome. Input The first line of the input contains a single integer T(T Each te

Occult 709

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Hdu 3948 The Number of Palindromes 后缀数组+Manacher

The Number of Palindromes Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 2692    Accepted Submission(s): 932 Problem Description

J. Cole 403

HDU 3948 The Number of Palindromes(后缀数组+RMQ)

题目链接: 3948 The Number of Palindromes 思路: 我们使用后缀数组+RMQ可以实现查找回文的功能,这题的重点的去重过程; 为了方便去重,我们不按字符串的下标来遍历,而按以及排好的rk[]的顺序去遍历; 维护一个变量cnt记录上次的回文串长度和此次高度数组两者的最小值,如果此次RMQ查询结果大于cnt,说明有新的回文串,否则就是重复的。 代码: #includ...

Yuhan的博客 199

HDU 3948 The Number of Palindromes(Manacher+后缀数组)

题意 求一个字符串中本质不同的回文子串的个数。 $ 1\leq |string| \leq 100000$ 思路 好像是回文自动机的裸题,但是可以用 \(\text{Manacher}\) (马拉车)算法配合后缀数组(或配合哈希表)解决。 \(\text{Manacher}\) 算法非常短小精悍,它可以在线性时空内求出以每个点为中心拓展的最远距离,筛出与 \(n\) 同阶个数个回文串,这些回文串包...

weixin_30768175的博客 114

HDU 3948 The Number of Palindromes (后缀数组 + ST表)

文章目录题目大意思路代码 题目链接 题目大意 给你一个字符串,找出有多少个不同的回文子串 思路 把给的字符串反向拼接到原字符串后面,然后用一个字符分隔开两个字符串,这样问题就变成了求最长公共前缀。 用ST表预处理每两个后缀的最长公共前缀,分奇偶统计回文子串,之后去重即可 有关去重的操作,代码里有详细解释 一些碎碎念:在书上学到后缀数组这个知识点后,我把后缀数组那一小节后面的习题拿出来组了个题单,前两道题还好,稍微想一想就能想明白,这是第三题,我想了一下午,仍然没想出来该怎么单独用后缀数组来解决qwq 去网

QAQ 250

HDU-3948-The Number of Palindromes(回文自动机模板题)

The Number of Palindromes Problem Description Now, you are given a string S. We want to know how many distinct substring of S which is palindrome. Input The first line of the input contains a single integer T(T<=20), which indicates number of test cases

qq_43461168的博客 227

HDU 3948-The Number of Palindromes-回文自动机

题意: 给出一个字符串,求其不相同回文子串的个数 思路: 回文自动机模板题,因为回文自动机中每个新建的结点就表示一个回文子串,各个结点都不相同 所以不同回文子串个数就是回文自动机中新增结点个数,直接输出即可 代码: #include &lt;bits/stdc++.h&gt; using namespace std; const int MAXN = 100005 ; const int N ...

Ogmx的博客 840
上一篇: NOIp2018游记
下一篇: BZOJ4518 征途
dogeding
博客等级 码龄10年 31粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值