BZOJ 3790: 神奇项链 manacher
2017-07-28 16:59
337 查看
3790: 神奇项链
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 551 Solved: 288
[Submit][Status][Discuss]
Description
母亲节就要到了,小 H 准备送给她一个特殊的项链。这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色。为了制作这个项链,小 H 购买了两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。例如:aba和aca连接起来,可以生成串abaaca或 abaca。现在给出目标项链的样式,询问你需要使用第二个机器多少次才能生成这个特殊的项链。
Input
输入数据有多行,每行一个字符串,表示目标项链的样式。Output
多行,每行一个答案表示最少需要使用第二个机器的次数。Sample Input
abcdcbaabacada
abcdef
Sample Output
02
5
HINT
每个测试数据,输入不超过 5行每行的字符串长度小于等于 50000
分析
就是问最少用多少个回文串可以覆盖整个区间,最后ans-1就行了。先跑一遍manacher,然后可以找到每个最长回文串的起点和终点(长的肯定比短的好)再贪心地选择最少的区间覆盖整个区间。
之前搜这道题看到树状数组优化……恐慌,结果贪心就能水了。。
贪心方法:先按起点从小到大排序,再选择起点在已覆盖的时间段内,终点最远的回文串。直至覆盖完全。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 100010; char s ,s1 ; int val ; int cnt=0; inline int Min(int a,int b){ return a<b?a:b; } struct node{ int l,r; }a ; void manacher(){ int len=strlen(s); for(register int i=0;i<len;i++) s1[++cnt]='#',s1[++cnt]=s[i]; s1[0]='+',s1[++cnt]='#'; int mx=0,id; for(register int i=1;i<=cnt;i++){ if(mx>=i) val[i]=Min(mx-i+1,val[id*2-i]); else val[i]=1; while(s1[i-val[i]]==s1[i+val[i]]) val[i]++; if(i+val[i]-1>mx) mx=i+val[i]-1,id=i; a[i].l=i-val[i]+1,a[i].r=i+val[i]-1; } } bool cmp(const node &a,const node &b){ return a.l<b.l||(a.l==b.l&&a.r<b.r); } int ti=1; int ans=0; #define ms(x,y) memset(x,y,sizeof(x)) void update(){ ans=0,ti=1,cnt=0; ms(val,0); } int main(){ // freopen("test.txt","r",stdin); while(scanf("%s",s)!=EOF){ update(); manacher(); //for(register int i=0;i<=cnt;i++) printf("%c",s1[i]); // for(register int i=1;i<=cnt;i++) // printf("%d %d\n",a[i].l,a[i].r); sort(a+1,a+cnt+1,cmp); for(register int i=1;i<=cnt;i++){ int x=0; if(a[i].r<=ti) continue; for(register int j=i;j<=cnt;j++){ if(a[j].l<=ti&&a[j].r>=a[x].r) x=j; else if(a[j].l>ti) break; } ti=a[x].r;ans++; if(ti>=cnt) break; } printf("%d\n",ans-1); } return 0; }
相关文章推荐
- BZOJ 3790 神奇项链 (manacher)
- manacher(马拉车)算法详解+例题一道【bzoj3790】【神奇项链】
- BZOJ 3790 神奇项链 Manacher 树状数组
- BZOJ 3790: 神奇项链 manacher+SPFA
- BZOJ3790 神奇项链 解题报告【字符串】【Manacher】【树状数组】【数据结构优化DP】
- 【BZOJ3790】神奇项链 Manacher+贪心
- BZOJ_3790_神奇项链_manacher+贪心
- 【BZOJ3790】神奇项链(manacher,树状数组)
- [bzoj3790]神奇项链 manacher
- [BZOJ 3790] 神奇项链 Manacher+贪心(权限题)
- BZOJ 3790: 神奇项链 [Manacher 贪心]
- bzoj 3790 神奇项链(Manacher,DP+BIT | 贪心)
- BZOJ 3790 神奇项链 (Manacher 贪心)
- bzoj 3790 神奇项链
- bzoj3790 神奇项链
- BZOJ 3790 神奇项链
- 【bzoj3790】【神奇项链】【manacher+dp+树状数组】
- [BZOJ3790] 神奇项链
- bzoj 3790: 神奇项链 manachar+dp+树状数组
- BZOJ 3790 神奇项链 Hash+二分