权限题...

描述:


Description

母亲节就要到了,小 H 准备送给她一个特殊的项链。这个项链可以看作一个用小写字
母组成的字符串,每个小写字母表示一种颜色。为了制作这个项链,小 H 购买了两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。例如:aba和aca连接起来,可以生成串abaaca或 abaca。现在给出目标项链的样式,询问你需要使用第二个机器多少次才能生成这个特殊的项链。 

Input

输入数据有多行,每行一个字符串,表示目标项链的样式。 

Output

多行,每行一个答案表示最少需要使用第二个机器的次数。 

Sample Input

abcdcba 
abacada 
abcdef

Sample Output

0
2
5

Hint

每个测试数据,输入不超过 5行 
每行的字符串长度小于等于 50000 

题目就是问给定的串最少是由多少个回文串覆盖构成的

关于回文串首先肯定想的是 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 神奇项链相关推荐

  1. [BZOJ3790]神奇项链

    Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色.为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...

  2. manacher算法学习(求最长回文子串长度)

    Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...

  3. 可以预防新冠病毒的项链 -脉动

    这是一款来自于美国航空航天局( NASA )用于预防感染新冠病毒的坠饰,它通过检测你的手是否靠近你的面部,使用震动来提醒你不要触碰你的面部鼻子.嘴巴,不要揉眼睛等.这套硬件是一个开源的项目,发布在 G ...

  4. JZOJ__Day 6:【普及模拟】神奇的项链(fett)

    题目描述 从前有一条神奇的项链,为什么说它神奇呢?因为它有两个性质: 1. 神奇的项链可以拉成一条线,线上依次是N 个珠子,每个珠子有一个能量值Ei: 2. 除了第一个和最后一个珠子,其他珠子都满足E ...

  5. 不出声也能命令Siri!康奈尔大学华人团队开发无声语言识别项链,中文英文都行...

    金磊 发自 凹非寺 量子位 | 公众号 QbitAI 这,或许是现在跟Siri交流最潮的方式了-- 只需要动动嘴皮子,就能让它under你的control. 没错,就是不需要出任何声音的那种. 这就是 ...

  6. USACO断开的项链(新技巧枚举)

    你有一条由 N 个珠子串成的项链,珠子的颜色有红.白.蓝三种,珠子在项链中呈随机分布. 例如N=29 时,两个项链的示例如下所示: 1 2 1 2r b b r b r r br b b br r b ...

  7. 离线区间的神奇——莫队算法

    离线区间的神奇--莫队算法 前言 一.什么是莫队算法? 二.例题分析: 1.相关例题 题目描述 输入格式 输出格式 简单分析: 三.莫队算法思想: 那么要怎么做(预处理):莫队算法优化的核心是**分块 ...

  8. 一段神奇的c代码错误分析

    源代码 #include <stdio.h>int main(int argc, char* argv[]) {int i = 0;int arr[3] = {0};printf(&quo ...

  9. python deque双端队列的神奇用法

    python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...

最新文章

  1. + ,- (加号,减号) 是数字类型吗?(sql server 2000中)
  2. 第一章 插件安装和代码导出
  3. 目前流行的装修风格_当下最流行十种装修风格,总有一款适合你!
  4. spy导入数据到oracle,运用SchemaSpy逆向工程制作数据库文档
  5. linux组手机nas,linux 搭建nas服务器
  6. c语言在键盘输入abc回车,C语言期末考试试卷子商务1111、21.doc
  7. 10月15日 第一天申请成功
  8. 最近一段时间遇到的费了时间的问题
  9. 设计模式学习之--Singleton(单例)模式
  10. 异常:Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.log4jdbc.Properties
  11. JavaScript:数据的存储
  12. Colaboratory读取谷歌云盘(Google drive)中的数据(2020年3月28日更新)
  13. matlab语法——subplot函数
  14. IBM 人工智能黑科技
  15. 2017-2018-2 20155314《网络对抗技术》Exp4 恶意代码分析
  16. [GAMES101]现代计算机图形学课程总结2:光栅化和反走样
  17. 有效的运营技巧让中国卖家在跨境电商领域销量翻番
  18. Qt 之 pro文件介绍及注意点
  19. 密码学:分组密码.(块密码:是一种对称密码算法)
  20. docker更换自己的阿里云镜像地址

热门文章

  1. Solarwinds 系列介绍
  2. 如何查看网页元素使用的js
  3. python识别中文人名_中文人名识别
  4. 战略制定4大关键要点
  5. 文献日志:EMNLP2020-自适应性语言普适分析器
  6. 【CF 732E】Sockets(优先队列+贪心)
  7. 惠普打印机常用墨盒加墨方法
  8. 一张通往计算机世界的地图
  9. 谈谈对“周日焦虑症”的看法
  10. 删除影响Modern Standby的几个服务