题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613

题意就是给你一个串s 然后求把s分成两部分之后的价值总和是多少,分开的串 如果是回文那么价值就是每个字母的价值之和,如果不是那么价值就是0;

例如:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

abbadf

那么可以分成abba 和df abba的价值是1+2+2+1=6,df不是回文串所以价值为0;总价值就是6;

我们可以用数组L【i】R【i】来记录串的前缀长度为i的是否是回文串和后缀长度为i的是否是回文串;

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N = 1e6+;
  6.  
  7. int v[], sum[N], p[N];
  8. ///sum[i]代表s串中前i个字符的价值总和;
  9. ///p[i]代表以i为中心的回文串的半径(包含i本身);
  10. char s[N];
  11. bool L[N], R[N];
  12. ///L[i]表示前i个字符是否是回文串,R[i]表示长度为i的后缀是否为回文串;
  13.  
  14. void Manacher(char s[], int n)
  15. {
  16. int Id = , mx = ;
  17. for(int i=; i<n; i++)
  18. {
  19. if(mx>i)
  20. p[i] = min(mx-i, p[Id*-i]);
  21. else
  22. p[i] = ;
  23. while(s[i+p[i]] == s[i-p[i]])
  24. p[i]++;
  25. if(mx < p[i]+i)
  26. {
  27. mx = p[i]+i;
  28. Id = i;
  29. }
  30.  
  31. if(p[i] == i)
  32. L[p[i]-] = true;
  33. if(p[i]+i == n)
  34. R[p[i]-] = true;
  35. }
  36. }
  37.  
  38. int main()
  39. {
  40. int T;
  41. scanf("%d", &T);
  42. while(T--)
  43. {
  44. memset(L, , sizeof(L));
  45. memset(R, , sizeof(R));
  46. memset(p, , sizeof(p));
  47. memset(sum, , sizeof(sum));
  48. for(int i=; i<; i++)
  49. scanf("%d", &v[i]);
  50. scanf("%s", s);
  51. int len = strlen(s);
  52. for(int i=; i<=len; i++)
  53. sum[i] += sum[i-] + v[s[i-]-'a'];
  54. for(int i=len; i>=; i--)
  55. {
  56. s[i+i+] = s[i];
  57. s[i+i+] = '#';
  58. }
  59. s[]='$';
  60. Manacher(s, *len+);
  61. int ans = ;
  62. for(int i=; i<len; i++)
  63. {
  64. int t=;
  65. if(L[i])
  66. t+=sum[i];
  67. if(R[len-i])
  68. t+=sum[len]-sum[i];
  69. ans = max(ans, t);
  70. }
  71. printf("%d\n", ans);
  72. }
  73. return ;
  74. }

Best Reward---hdu3613(manacher 回文串)的更多相关文章

  1. 2015 UESTC Training for Search Algorithm & String - M - Palindromic String【Manacher回文串】

    O(n)的复杂度求回文串:Manacher算法 定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串 现在给一个2*10^6长度 ...

  2. UVA 12378 Ball Blasting Game 【Manacher回文串】

    Ball Blasting Game Morteza is playing a ball blasting game. In this game there is a chain of differe ...

  3. HDU3068 最长回文 MANACHER+回文串

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符 ...

  4. Manacher回文串算法学习记录

    FROM:  http://hi.baidu.com/chenwenwen0210/item/482c84396476f0e02f8ec230 #include<stdio.h> #inc ...

  5. 【模板】Manacher 回文串

    推荐两个讲得很好的博客: http://blog.sina.com.cn/s/blog_70811e1a01014esn.html https://segmentfault.com/a/1190000 ...

  6. HDU 3613 Best Reward(manacher求前、后缀回文串)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 题目大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分 ...

  7. HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )

    题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问 ...

  8. HDU 3613 Best Reward(KMP算法求解一个串的前、后缀回文串标记数组)

    题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...

  9. (回文串 )Best Reward -- hdu -- 3613

    http://acm.hdu.edu.cn/showproblem.php?pid=3613 Best Reward Time Limit: 2000/1000 MS (Java/Others)    ...

随机推荐

  1. JAVA第一个窗体小程序

    import java.awt.*;public class Day1015_Frame{    public static void main(String[] args)    {         ...

  2. 跟着百度学习php之ThinkPHP的运行流程-2

    Thinkphp为了提高编译的效率,第一次运行的时候thinkphp会把文件全部编译到temp目录下的~runtime.php文件,在第二次运行的时候会直接读取这个文件.所以我们在线下自己写代码测试的 ...

  3. Android开发之Fragment传递參数的几种方法

    Fragment在Android3.0開始提供,而且在兼容包中也提供了Fragment特性的支持. Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自己定义Fragmen ...

  4. Ubuntu 12.04 Subversion及GUI客户端RabbitVCS安装

    (经过一天的使用,发现pygtk的内存泄漏问题严重影响使用,需要打一下deepin ui做的补丁:https://github.com/linuxdeepin/deepin-ui) 1. 类似Tort ...

  5. Github优秀开源项目

    王潜升 https://github.com/code4craft/webmagic 一个爬虫框架,除了不会反爬虫外(当然可以自己加)其他都很牛逼.这个项目更新还是很快的.   ansi分词  htt ...

  6. window.parent.document解决原生js或jQuery 实现父窗口的问题

    做WEB前端开发的过程中,经常会有这样的需求,用户点击[编辑]按钮,弹出一个对话框,在里边修改相应的值,然后把修改后的值显示在原页面,最后点击保存. 用window.parent.document.g ...

  7. 利用U盘给Intel NUC安装CentOS

    一,UltraISO(用来制作 U 盘启动) 需要新版9.6 下载地址为:http://www.onlinedown.net/soft/614.htm 软件注册码:王涛 7C81-1689-4046- ...

  8. gitolite 服务器搭建

    网上大牛都说的是安装gitolite要建git用户,我看完全没必要,毕竟用户拿到私钥也未必能登录服务器吧...下面我们就用root用户来安装gitolite,并且配置版本库文件保存路径.. 1. gi ...

  9. ChemDraw使用不了怎么办

    ChemDraw作为一款专业级的化学绘图软件,不仅可以帮助用户绘制图像在数据计算方面也起了很大作用,因此,ChemDraw非常受用户的欢迎.但是我们在使用过程中难免会遇到各种问题,特别是对于新手用户, ...

  10. 使用cordova+Ionic+AngularJs进行Hybird App开发的环境搭建手冊

    一.所需工具 1,JDK:生成 2.安卓SDK开发环境 3,NodeJs:主要使用的还是npm 4,Python开发环境 5.VS 2012(2008,2015也能够,已亲測):安装这个主要是须要一些 ...