3790: 神奇项链

2024-03-27 04:48
文章标签 神奇 项链 3790

本文主要是介绍3790: 神奇项链,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

容易发现,处理回文串的时候得到的答案是可以去更新答案的,
即 令 f[i] f [ i ] 表示处理前 i i 个最小由几个回文串构成,
那么,对于第i个位置,他由 [ip[i],n] [ i − p [ i ] , n ] 能更新的就是 前 [1,i+p[i]1] [ 1 , i + p [ i ] − 1 ]
因为前后缀相同能直接放在一起,容易正确性很显然
然后dp方程用树状数组维护即可。
c++代码如下:

#include<bits/stdc++.h>
#define lowbit(x) (x & -x)
#define rep(i,x,y) for(register int i = x; i <= y; ++ i)
#define repd(i,x,y) for(register int i = x; i >= y; -- i)
using namespace std;
typedef long long ll;
template<typename T>inline void read(T&x)
{char c;int sign = 1;x = 0;do { c = getchar(); if(c == '-') sign = -1; }while(!isdigit(c));do { x = x * 10 + c - '0'; c = getchar(); }while(isdigit(c));x *= sign;
}const int N = 2e5+50;
char s[N];
int n,p[N],mx;
int t[N];inline void update(int x,int w)
{if(x <= 0) x = 1;for(register int i = x;i <= n; i += lowbit(i))t[i] = min(t[i],w); 
}inline int query(int x)
{int ans = 0x3f3f3f3f;for(register int i = x; i ; i -= lowbit(i))ans = min(ans,t[i]);return ans;
}int main()
{while(~scanf("%s",s + 1)){memset(t,0x3f,sizeof t);n = strlen(s + 1);repd(i,n,1) s[i<<1] = s[i],s[i<<1|1] = '#';s[0] = '?'; s[1] = '#';mx = 0; n <<= 1;++n;t[n+1] = t[n+2] = t[n+3] = 0;rep(i,1,n){if(p[mx] + mx > i) p[i] = min(p[mx] + mx - i,p[mx*2-i] );else p[i] = 1;while(s[i - p[i]] == s[i + p[i]]) ++ p[i];if(p[i] + i > mx + p[mx]) mx = i;int x = query(n - i + 1 + p[i]);update(n - i + 1 - p[i] + 1,x + 1);}printf("%d\n",query(2)-1);}return 0;
}

这篇关于3790: 神奇项链的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850982

相关文章

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin

Redis 管道的神奇力量

今天我们要来探索一个 Redis 中非常强大且实用的特性——管道(Pipeline)。如果你想让你的 Redis 操作更加高效,那么这篇文章绝对值得一读。 一、Redis 管道是什么 Redis 管道是一种在客户端和服务器之间批量执行命令的技术。它允许客户端将多个命令一次性发送到服务器,而不是逐个发送并等待每个命令的响应。服务器会按照顺序执行这些命令,并将所有命令的响应一次性返回给客户端。

入门篇:神奇的Annotation

涅槃1992 关注 2016.12.25 23:41* 字数 4964 阅读 1059评论 3喜欢 29 前面写了Android 开发:由模块化到组件化(一),很多小伙伴来问怎么没有Demo啊?之所以没有立刻放demo的原因在还有许多技术点没说完. 今天我们就来细细评味Java当中Annotation,也就是我们常说的注解. 本文按照以下顺序进行:元数据->元注解->运行时注解->编译时

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

一个人就能干一个团队剪辑工作?云微客就是这么神奇

你知道拍摄、剪辑一条视频需要花费多长时间吗?半个小时?还是一个小时呢?如果我想一天发布上百条视频,你觉得可能吗?很显然,仅凭个人是很难办到的,那么就需要借助工具,而云微客AI批量剪辑系统正好可以解决这个难题。 在当下这个短视频风靡的时代,不管是企业还是个人创作者们都需要借助各种工具和系统来提升创作内容的生产效率和传播效果。而云微客AI批量剪辑系统凭借着批量剪辑的功能,为创作者带来了很大的

神奇的android广播

最近用了android的广播,个人感觉非常好用: 首先在你要接收的地方注册一个: context.registerReceiver(myReceiver, new IntentFilter("com.shic.action.d")); 然后就是定义注册的这个,在接收到广播后执行的操作: BroadcastReceiver myReceiver = new BroadcastRecei

【COGS】421 [SDOI2009] HH的项链 树状数组

传送门:【COGS】421 [SDOI2009] HH的项链 题目分析:将区间以右端点为关键字降序排序,然后从左到右依次遍历每个数并插入到树状数组中,如果遍历到一个数的时候在他的前面已经有一个相同的数时,将之前位置上的数从树状数组中删除。然后我们每处理完一个位置上的数后,看这个位置上是否有右端点,如果有则做一次求和,这个右端点属于的区间【L,R】的值即sum(R)-sum(L-1)。

神奇的babel

2015年,ECMA推出es6,在es5的基础上添加了各种人性化开发的新特性,详见es2015 让人头疼的是当下主流浏览器的JS引擎并不识别es6语法,所以我们需要将es6的语法翻译成es5的形式再提交给js引擎执行。 那有没有好的工具来实现两种标准之间的转换呢,有,babel。 好,既然用到babel,那么第一步肯定要在项目中安装babel。安装的方法可参照点击打开链接 npm i

探索PDF的奥秘:pdfrw库的神奇之旅

文章目录 探索PDF的奥秘:pdfrw库的神奇之旅背景:为何选择pdfrw?pdfrw是什么?如何安装pdfrw?五个简单的库函数使用方法场景应用:pdfrw在实际工作中的应用常见问题与解决方案总结 探索PDF的奥秘:pdfrw库的神奇之旅 背景:为何选择pdfrw? 在数据处理的世界中,PDF文件因其格式的稳定性和广泛兼容性而备受青睐。然而,处理PDF文件往往需要专

【Linux】Linux命令行大冒险:寻找、搜索与压缩的神奇之旅

欢迎来到 CILMY23 的博客 🏆本篇主题为:Linux命令行大冒险:寻找、搜索与压缩的神奇之旅 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题 | 代码训练营 🏆感谢观看,支持的可以给个一键三连,点赞收藏+评论。如果你觉得有帮助,还可以点点关注 前言: 我们也