BZOJ 3790 Manacher 解题报告
来源:互联网 发布:蓝牙串口软件ymodem 编辑:程序博客网 时间:2024/05/18 11:01
3790: 神奇项链
Description
母亲节就要到了,小 H 准备送给她一个特殊的项链。这个项链可以看作一个用小写字
母组成的字符串,每个小写字母表示一种颜色。为了制作这个项链,小 H 购买了两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。例如:aba和aca连接起来,可以生成串abaaca或 abaca。现在给出目标项链的样式,询问你需要使用第二个机器多少次才能生成这个特殊的项链。
Input
输入数据有多行,每行一个字符串,表示目标项链的样式。
Output
多行,每行一个答案表示最少需要使用第二个机器的次数。
Sample Input
abcdcba
abacada
abcdef
Sample Output
0
2
5
HINT
每个测试数据,输入不超过 5行
每行的字符串长度小于等于 50000
【解题报告】
题目:给出一个字符串(len<=10^5),求这个字符串最少由几个回文串拼接而成。注意拼接时可以把重复部分重叠起来,如: aba 和aca可以拼接成abaaca 或abaca。
于是再一次显而易见的Manacher过后,问题就变成了选择最少的区间覆盖整个区间的经典贪心。
不过除了贪心好像也可以用数据结构优化Dp来做
代码如下:
/************************************************************** Problem: 3790 User: onepointo Language: C++ Result: Accepted Time:104 ms Memory:2676 kb****************************************************************/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 100010 int pal[N<<1];char a[N],s[N<<1];struct Node{ int l,r; bool operator<(const Node &other)const { if(l==other.l) return r>other.r; return l<other.l; }}t[N];int manacher(){ int len=strlen(a); int mx=0,id=0; for(int i=1;i<=len;++i) s[i<<1]=a[i-1],s[i<<1|1]='#'; len<<=1,len+=1; s[0]='+',s[1]='#',s[len+1]='-'; for(int i=1;i<=len;++i) { if(mx>i) pal[i]=min(mx-i,pal[2*id-i]); else pal[i]=1; while(s[i-pal[i]]==s[i+pal[i]]) ++pal[i]; if(mx<pal[i]+i) mx=pal[i]+i,id=i; } for(int i=1;i<=len;++i) t[i].l=i-pal[i]+1,t[i].r=i+pal[i]-1; sort(t+1,t+1+len); return len;}int main(){ while(scanf("%s",a)!=EOF) { int len=manacher(),ans=0; int wh=t[1].r,tmp=1,pos=0; while(wh<len) { while(t[tmp].l<=wh) pos=max(pos,t[tmp++].r); wh=pos;ans++; } printf("%d\n",ans); } return 0;}
阅读全文
0 0
- BZOJ 3790 Manacher 解题报告
- BZOJ 2160 Manacher 解题报告
- BZOJ 2565 Manacher 解题报告
- POJ 3974 Manacher 解题报告
- HDU 3294 解题报告 Manacher 算法
- POJ3974 Palindrome 解题报告【字符串】【Manacher】
- BZOJ 1588 TREAP 解题报告
- bzoj 3223 splay 解题报告
- BZOJ 3223 Splay 解题报告
- BZOJ 3224 TREAP 解题报告
- BZOJ 1820 DP 解题报告
- BZOJ 2144 LCA 解题报告
- BZOJ 4152 博弈论 解题报告
- BZOJ 1566 DP 解题报告
- BZOJ 3119 贪心 解题报告
- bzoj 1036 树链剖分 解题报告
- bzoj 3696 化合物 解题报告
- BZOJ 2563 贪心 解题报告
- UVA
- OpenGL超级宝典visual studio 2013开发环境配置,GLTools
- 1.输入子系统
- opencv1-基础库
- [HiHoCoder]#1015 : 马拉车
- BZOJ 3790 Manacher 解题报告
- 排序中的数据结构
- 20个非常有用的Java程序片段
- UML类图各符号意义
- Ubuntu17.04 安装搜狗中文输入法
- 修改Ubuntu14.04虚拟机MTU值
- Fire! UVA-11624
- 微服务:Spring Boot第二篇——运行原理和HelloWorld
- HDU 6048 Puzzle(滑块游戏)