【题意】

你可以产生一个回文串,也可以将两个串合并成一个串,问产生目标串需要的最少合并次数。

【思路】

  显然我们要先产生目标串中包含的极大回文字符串。

Manacher求出每个位置可以向两边延伸的最长回文串。

则题目转化为有若干条线段,求最少的线段将[1..n]覆盖。贪心DP皆可上,DP需要BIT优化一下。

【代码】

  1. #include<set>
  2. #include<cmath>
  3. #include<queue>
  4. #include<vector>
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<iostream>
  8. #include<algorithm>
  9. #define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
  10. #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  11. using namespace std;
  12.  
  13. typedef long long ll;
  14. const int N = 2e5+;
  15. const int inf = 1e9;
  16.  
  17. struct Node
  18. {
  19. int l,r;
  20. bool operator < (const Node& rhs) const
  21. {
  22. return r<rhs.r;
  23. }
  24. } q[N];
  25. int tot;
  26.  
  27. char s[N],a[N];
  28. int n,m,p[N];
  29.  
  30. int C[N];
  31. void upd(int x,int v)
  32. {
  33. for(int i=x;i;i-=i&(-i))
  34. C[i]=min(C[i],v);
  35. }
  36. int query(int x)
  37. {
  38. if(x==) return ;
  39. int res=inf;
  40. for(int i=x;i<=n;i+=i&(-i))
  41. res=min(res,C[i]);
  42. return res;
  43. }
  44.  
  45. void Add(int l,int r)
  46. {
  47. l=l/+,r=r/-;
  48. if(l>r) return ;
  49. q[++tot]=(Node){l,r};
  50. }
  51. void Manacher()
  52. {
  53. m=*n+;
  54. for(int i=;i<=n;i++)
  55. {
  56. a[i<<]=s[i];
  57. a[i<<|]='#';
  58. }
  59. a[]='+',a[m+]='-',a[]='#';
  60. int mx=,id;
  61. for(int i=;i<=m;i++)
  62. {
  63. if(mx>i) p[i]=min(mx-i,p[id*-i]);
  64. else p[i]=;
  65. while(a[i-p[i]]==a[i+p[i]]) p[i]++;
  66. Add(i-p[i],i+p[i]);
  67. if(p[i]+i>mx) mx=i+p[i],id=i;
  68. }
  69. }
  70.  
  71. int dp()
  72. {
  73. int ans=inf;
  74. sort(q+,q+tot+);
  75. FOR(i,,tot)
  76. {
  77. int x=query(q[i].l-)+;
  78. upd(q[i].r,x);
  79. if(q[i].r==n) ans=min(ans,x);
  80. }
  81. return ans;
  82. }
  83.  
  84. int main()
  85. {
  86. while(scanf("%s",s+)==)
  87. {
  88. memset(p,,sizeof(p));
  89. tot=;
  90. n=strlen(s+);
  91. FOR(i,,n) C[i]=inf;
  92. Manacher();
  93. printf("%d\n",dp()-);
  94. }
  95. return ;
  96. }

bzoj 3790 神奇项链(Manacher,DP+BIT | 贪心)的更多相关文章

  1. BZOJ 3790: 神奇项链 [Manacher 贪心]

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

  2. BZOJ 3790 神奇项链 hash/后缀自动机+贪心

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

  3. BZOJ 3790 神奇项链(manacher+贪心)

    3790: 神奇项链 Time Limit: 10 Sec  Memory Limit: 64 MB Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小 ...

  4. bzoj 3790: 神奇项链

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

  5. bzoj 3790 神奇项链 回文串 manacher|PAM

    LINK:神奇项链 存在两个操作:1. 一个操作可以生成所有形式的回文串 2.一个操作可以将两个串给合并起来 如果前缀和后缀相同还可以将其并起来. 多组询问 每次询问合成一个串所需最少多少次2操作. ...

  6. BZOJ 3790 神奇项链(manacher+DP+树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3790 [题目大意] 问最少用几个回文串可以构成给出串,重叠部分可以合并 [题解] 我们 ...

  7. BZOJ 3790 神奇项链(回文自动机+线段树优化DP)

    我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP. #include<iostream> #incl ...

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

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

  9. 【BZOJ3790】神奇项链 Manacher+贪心

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

随机推荐

  1. RPM 安装oracle18c 修改字符集的方法

    1. 安装完preinstall 和 oracle 的rpm版本之后 到这个界面 rpm -ivh oracle-database-preinstall-18c-.el7.x86_64.rpm war ...

  2. poj 1966(顶点连通度)

    题意:给出一个n个节点和m条边的图,求该图的顶点连通度. 分析: 顶点连通度的求解可以转换为网络最大流问题. (1)原图G中的每个顶点v变成网络中的两个顶点v‘和v’‘,顶点v’至v''有一个条弧(有 ...

  3. sql学习. case + group by 都干了啥子事情

    select case pref_name when 'fudao' then 'siguo' when 'xiangchuan' then 'siguo' when 'aiyuan' then 's ...

  4. Kafka日志存储原理

    引言 Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的.每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建 ...

  5. linq 左连接实现两个集合的合并

    //第一个集合为所有的数据 var specilist = new List<Me.SpecificationsInfo>(); var resultall = (from a in db ...

  6. C++模式学习------策略模式

    当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...

  7. 【刷题】BZOJ 3591 最长上升子序列

    Description 给出1~n的一个排列的一个最长上升子序列,求原排列可能的种类数. Input 第一行一个整数n. 第二行一个整数k,表示最长上升子序列的长度. 第三行k个整数,表示这个最长上升 ...

  8. 【agc006f】Blackout(神仙题)

    [agc006f]Blackout(神仙题) 翻译 给定一个\(n*n\)的网格图,有些格子是黑色的.如果\((x,y),(y,z)\)都是黑色的,那么\((y,x)\)也会被染黑,求最终黑格子数量. ...

  9. Linux查看硬件信息命令

    一.查看服务器硬件信息 (1)查看服务器型号.序列号 [root@Master ~]# dmidecode|grep "System Information" -A9|egrep  ...

  10. 单点登录(十四)-----实战-----cas5.0.x登录mongodb验证方式常规的四种加密的思考和分析

    我们在上一篇文章中已经讲解了cas4.2.X登录启用mongodb验证方式 单点登录(十三)-----实战-----cas4.2.X登录启用mongodb验证方式完整流程 但是密码是明文存储的,也就是 ...