题意:

思路:生成一些回文拼起来使生成的段数最小

显然存在一种最优的方案,使生成的那些回文是目标串的极长回文子串

求出对于每个位置的最长回文子串,问题就转化成了:

给定一些已知起始和终止位置的线段,求覆盖住整个区域的最小线段数量

这个可以BIT做,求当前已经覆盖的区域最远能拓展到哪里

也可以预处理一下前缀最小值,跳转时直接调用即可

  1. const oo=;
  2. var t,a,x,y,p:array[..]of longint;
  3. len,n,i,id,mx,ans,m:longint;
  4. ch:ansistring;
  5.  
  6. function lowbit(x:longint):longint;
  7. begin
  8. exit(x and (-x));
  9. end;
  10.  
  11. function max(x,y:longint):longint;
  12. begin
  13. if x>y then exit(x);
  14. exit(y);
  15. end;
  16.  
  17. function min(x,y:longint):longint;
  18. begin
  19. if x<y then exit(x);
  20. exit(y);
  21. end;
  22.  
  23. procedure update(x,y:longint);
  24. begin
  25. while x<=n- do
  26. begin
  27. t[x]:=max(t[x],y);
  28. x:=x+lowbit(x);
  29. end;
  30. end;
  31.  
  32. function query(x:longint):longint;
  33. begin
  34. query:=-oo;
  35. while x> do
  36. begin
  37. query:=max(query,t[x]);
  38. x:=x-lowbit(x);
  39. end;
  40. end;
  41.  
  42. begin
  43. assign(input,'bzoj3790.in'); reset(input);
  44. assign(output,'bzoj3790.out'); rewrite(output);
  45. while not eof do
  46. begin
  47. readln(ch);
  48. len:=length(ch);
  49. if len= then break;
  50. fillchar(a,sizeof(a),);
  51. fillchar(p,sizeof(p),);
  52. n:=; a[]:=; a[]:=;
  53. for i:= to len do
  54. begin
  55. inc(n); a[n]:=ord(ch[i])-ord('a')+;
  56. inc(n); a[n]:=;
  57. end;
  58. inc(n); a[n]:=;
  59. mx:=; id:=;
  60. for i:= to n- do
  61. begin
  62. if mx>i then p[i]:=min(p[id*-i],mx-i)
  63. else p[i]:=;
  64. while a[i-p[i]]=a[i+p[i]] do inc(p[i]);
  65. if p[i]+i>mx then
  66. begin
  67. mx:=p[i]+i; id:=i;
  68. end;
  69. end;
  70. for i:= to m do
  71. begin
  72. x[i]:=; y[i]:=;
  73. end;
  74. m:=;
  75. for i:= to n- do
  76. begin
  77. inc(m); x[m]:=i-p[i]; y[m]:=i+p[i]-;
  78. end;
  79. fillchar(t,sizeof(t),);
  80. for i:= to m do update(x[i],y[i]);
  81. i:=; ans:=;
  82. while i<n- do
  83. begin
  84. i:=query(i+);
  85. inc(ans);
  86. end;
  87. writeln(ans-);
  88. end;
  89. close(input);
  90. close(output);
  91. end.

【BZOJ3790】神奇项链(manacher,树状数组)的更多相关文章

  1. 【BZOJ-3790】神奇项链 Manacher + 树状数组(奇葩) + DP

    3790: 神奇项链 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 304  Solved: 150[Submit][Status][Discuss] ...

  2. 【BZOJ】1878: [SDOI2009]HH的项链(树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1878 我太弱了,看题解才过的. 一开始看到此题,我想了想在线做法,但之后觉得这个想法可能是错的:维护 ...

  3. BZOJ 1878: [SDOI2009]HH的项链 离线树状数组

    1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  4. hdu6230 Palindrome(manacher+树状数组)

    题目链接: Palindrome Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Other ...

  5. 【bzoj2565】最长双回文串 Manacher+树状数组

    原文地址:http://www.cnblogs.com/GXZlegend/p/6802558.html 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc ...

  6. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  7. HDU 6230 Palindrome ( Manacher && 树状数组)

    题意 : 给定一个字符串S,问你有多少长度为 n 的子串满足  S[i]=S[2n−i]=S[2n+i−2] (1≤i≤n) 参考自 ==> 博客 分析 : 可以看出满足题目要求的特殊回文子串其 ...

  8. 洛谷P1972 [SDOI2009]HH的项链(树状数组)

    题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...

  9. 【洛谷P1972】HH的项链 离线+树状数组

    题目大意:静态查询序列区间颜色数. 题解:对于一个查询区间 [l , r] ,若有两个相同颜色的点在这个区间中,则总是取下标靠近端点 r 的颜色计入答案贡献.对于每个下标,记录下在这个下标之前,且距离 ...

  10. [BZOJ1878][SDOI2009] HH的项链 (树状数组)

    link 一道简单题. 不用可持久化. 对于统计颜色个数,可以看与其颜色一样的前一个位置. 设$las(i)$表示其与$i$颜色相等的上一个位置. 则对于二元组$(l,r)$,其答案为$\sum_{i ...

随机推荐

  1. Elementui tabs组件内添加组件

    1. Elementui tabs组件内添加组件 1.1. 需求 今天的一个需求是在后台框架的基础上添加tab页,结果页面如下 原本上述红框内的内容是不存在的,直接点击左侧菜单栏进行页面跳转,现加了t ...

  2. Java多线程(一) Thread和 Runnable

    http://www.cnblogs.com/lwbqqyumidi/p/3804883.html 1.继承Thread 2.实现Runnable接口 public class MyRunnable ...

  3. JS 实现PDF文件打印

    function PdfPrint() {        bdhtml = window.document.body.innerHTML;        sprnstr = "<!-- ...

  4. [Qt Creator 快速入门] 第0篇 开始学习Qt 与Qt Creator

    Qt官方信息 Qt官网:http://qt.digia.com/ Qt开源官网:http://qt-project.org/ Qt最新版本下载:http://qt-project.org/downlo ...

  5. Manacher HDOJ 3068 最长回文

    题目传送门 关于求解最长回文子串,有dp做法,也有同样n^2的但只用O(1)的空间,还有KMP,后缀数组?? int main(void) { ) == ) { ); memset (dp, fals ...

  6. DFS POJ 3087 Shuffle'm Up

    题目传送门 /* 题意:两块扑克牌按照顺序叠起来后,把下半部分给第一块,上半部给第二块,一直持续下去,直到叠成指定的样子 DFS:直接模拟搜索,用map记录该字符串是否被搜过.读懂题目是关键. */ ...

  7. 数学 HDOJ 5301 Buildings

    题目传送门 /* 题意:n*m列的矩阵,删除一个格子x,y.用矩形来填充矩阵.且矩形至少有一边是在矩阵的边缘上. 求满足条件的矩形填充方式中面积最大的矩形,要使得该最大矩形的面积最小. 分析:任何矩形 ...

  8. 改变默认选择前1000行,编辑前200行【MSSQL】

  9. 获取Spring容器中的Bean协助调试

    在使用Spring进行开发时,有时调bug真的是很伤脑筋的一件事,我们可以通过自定义一个监听器来获取Spring容器中的Bean实例来协助我们调试. 第一步:编写自定义监听器 /** * 监听serv ...

  10. C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(249,5): error MSB6006: “CL.exe”已退出,代码为 -1073741515。

    解决: Add this to your PATH environment variables: C:\Program Files (x86)\Microsoft Visual Studio 11.0 ...