BZOJ3790 神奇项链
权限题...
描述:
Description
Input
Output
Sample Input
abcdcba
abacada
abcdef
Sample Output
0
2
5
Hint
题目就是问给定的串最少是由多少个回文串覆盖构成的
关于回文串首先肯定想的是 manacher
用 manacher 可以求出每个回文串
题目问的是给定的串最少是由多少个回文串覆盖构成的
那就变成了经典的线段覆盖问题
贪心一波就好了:
开一个数组 lin[ i ] 表示从第 i 个字符开始的回文串的最长长度
首先第一个字符一定要被覆盖到
那么就选 1~lin[ 1 ] 的线段来覆盖
然后考虑lin[ 1 ] + 1 的点一定要被覆盖到
枚举 2~lin[ 1 ] +1 开头的所有线段,找到右端点最右的线段并选择
然后考虑更后面的点,用同样的方法贪心即可
这么显然的贪心应该不用证明吧
复杂度 O(n)
然后答案就是选择的线段数量-1
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int N=2e5+7;; char s[N],a[N]; int f[N],ans; int lin[N];//注意此时的lin[i]是在原串时下标i void manacher() {int len=strlen(s+1);len=len*2+1;a[0]='$';for(int i=1;i<=len;i++)a[i]= (i&1) ? '#' : s[i>>1];int pos=0,mx=0;for(int i=1;i<=len;i++){f[i]= i<mx ? min(f[(pos<<1)-i],mx-i) : 1;while(a[i+f[i]]==a[i-f[i]]) f[i]++;if(i+f[i]>mx) mx=i+f[i],pos=i;} } void slove() {int ans=0,mx=0,pos=0,len=strlen(s+1);for(int i=2;i<=len<<1;i++){pos=(i>>1)-(f[i]>>1)+1;lin[pos]=max(lin[pos],f[i]-1);//计算出lin数组 }int i=1;while(i<=len){mx=max(mx,i+lin[i]-1); pos=mx;for(int j=i+1;j<=pos;j++)mx=max(mx,j+lin[j]-1);//贪心ans++; i=pos+1;}printf("%d\n",ans-1);//线段数量-1 } int main() {while(scanf("%s",s+1)!=EOF){memset(f,0,sizeof(f));memset(a,0,sizeof(a));memset(lin,0,sizeof(lin));manacher();slove();}return 0; }
当然因为数据不大,所以 manacher 可以换成哈希
枚举中心然后二分可能长度,复杂度O(nlogn)
代码就不贴了
转载于:https://www.cnblogs.com/LLTYYC/p/9701599.html
BZOJ3790 神奇项链相关推荐
- [BZOJ3790]神奇项链
Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色.为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...
- manacher算法学习(求最长回文子串长度)
Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...
- 可以预防新冠病毒的项链 -脉动
这是一款来自于美国航空航天局( NASA )用于预防感染新冠病毒的坠饰,它通过检测你的手是否靠近你的面部,使用震动来提醒你不要触碰你的面部鼻子.嘴巴,不要揉眼睛等.这套硬件是一个开源的项目,发布在 G ...
- JZOJ__Day 6:【普及模拟】神奇的项链(fett)
题目描述 从前有一条神奇的项链,为什么说它神奇呢?因为它有两个性质: 1. 神奇的项链可以拉成一条线,线上依次是N 个珠子,每个珠子有一个能量值Ei: 2. 除了第一个和最后一个珠子,其他珠子都满足E ...
- 不出声也能命令Siri!康奈尔大学华人团队开发无声语言识别项链,中文英文都行...
金磊 发自 凹非寺 量子位 | 公众号 QbitAI 这,或许是现在跟Siri交流最潮的方式了-- 只需要动动嘴皮子,就能让它under你的control. 没错,就是不需要出任何声音的那种. 这就是 ...
- USACO断开的项链(新技巧枚举)
你有一条由 N 个珠子串成的项链,珠子的颜色有红.白.蓝三种,珠子在项链中呈随机分布. 例如N=29 时,两个项链的示例如下所示: 1 2 1 2r b b r b r r br b b br r b ...
- 离线区间的神奇——莫队算法
离线区间的神奇--莫队算法 前言 一.什么是莫队算法? 二.例题分析: 1.相关例题 题目描述 输入格式 输出格式 简单分析: 三.莫队算法思想: 那么要怎么做(预处理):莫队算法优化的核心是**分块 ...
- 一段神奇的c代码错误分析
源代码 #include <stdio.h>int main(int argc, char* argv[]) {int i = 0;int arr[3] = {0};printf(&quo ...
- python deque双端队列的神奇用法
python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...
最新文章
- + ,- (加号,减号) 是数字类型吗?(sql server 2000中)
- 第一章 插件安装和代码导出
- 目前流行的装修风格_当下最流行十种装修风格,总有一款适合你!
- spy导入数据到oracle,运用SchemaSpy逆向工程制作数据库文档
- linux组手机nas,linux 搭建nas服务器
- c语言在键盘输入abc回车,C语言期末考试试卷子商务1111、21.doc
- 10月15日 第一天申请成功
- 最近一段时间遇到的费了时间的问题
- 设计模式学习之--Singleton(单例)模式
- 异常:Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.log4jdbc.Properties
- JavaScript:数据的存储
- Colaboratory读取谷歌云盘(Google drive)中的数据(2020年3月28日更新)
- matlab语法——subplot函数
- IBM 人工智能黑科技
- 2017-2018-2 20155314《网络对抗技术》Exp4 恶意代码分析
- [GAMES101]现代计算机图形学课程总结2:光栅化和反走样
- 有效的运营技巧让中国卖家在跨境电商领域销量翻番
- Qt 之 pro文件介绍及注意点
- 密码学:分组密码.(块密码:是一种对称密码算法)
- docker更换自己的阿里云镜像地址