博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ3790] 神奇项链
阅读量:5153 次
发布时间:2019-06-13

本文共 857 字,大约阅读时间需要 2 分钟。

题目大意:用最少的回文串覆盖整个字符串,可重叠。

题解:Manacher+贪心

md最近好几个线段覆盖的题都没看出来。

Manacher算出以每个字符为中心的回文串,就是一个线段,计算出左端点i-Len[i]+1和

右端点i+Len[i]-1,然后贪心用每个线段覆盖区间就好了,两个回文串,就是两个区间是

可以重叠的。贪心嘛,就是以左端点为第一关键字,右端点为第二关键字排序。没次找

能与上一条线段相接的右端点最大的就行了。

代码:

#include
#include
#include
#include
#define maxn 50009using namespace std; char s[maxn*2],str[maxn*2];int len,Len[maxn*2];struct X{ int l,r;}xd[maxn*2]; bool cmp(X a,X b){ if(a.l!=b.l)return a.l
b.r;} void getstr(){ int k=0;str[k++]='$'; for(int i=0;i
i)Len[i]=min(Len[2*id-i],mx-i); else Len[i]=1; while(str[i+Len[i]]==str[i-Len[i]])Len[i]++; if(i+Len[i]>mx)mx=i+Len[i],id=i; }} int main(){ while(scanf("%s",&s)!=EOF){ len=strlen(s); Manacher(); for(int i=1;i

 

转载于:https://www.cnblogs.com/zzyh/p/7679089.html

你可能感兴趣的文章
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
淡定,啊。数据唯一性
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>