题目:hdu3613;

题意:有26字母对应的价值,然后给出以个串,把它分成两段字串,如果字串是回文串,串的价值就是每个字符和,不是就为0。求最大价值。

博客

分析:拓展KMP的应用求回文字串。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string>
  5. #include<string.h>
  6. using namespace std;
  7. const int max_=5e6+;
  8. int extend1[max_],extend2[max_],v[],w[max_], nex[max_];
  9. void getnext(string str)
  10. {
  11. int a=,p=;
  12. int len=str.size();
  13.  
  14. nex[]=len;
  15. for(int i=;i<len;i++)
  16. {
  17. if(i>=p||i+nex[i-a]>=p)
  18. {
  19. if(i>=p)
  20. p=i;
  21. while(str[p-i]==str[p]&&p<len)
  22. p++;
  23. nex[i]=p-i;
  24. a=i;
  25. }
  26. else
  27. nex[i]=nex[i-a];
  28. }
  29. }
  30. void getextend(string str,string mo,int *ex)
  31. {
  32. int a=,p=;
  33. getnext(mo);
  34. int m=mo.size();
  35. int len=str.size();
  36. for(int i=;i<len;i++)
  37. {
  38. if(i>=p||i+nex[i-a]>=p)
  39. {
  40. if(i>=p)
  41. p=i;
  42. while(str[p]==mo[p-i]&&p<len&&p-i<m)
  43. p++;
  44. ex[i]=p-i;
  45. a=i;
  46. }
  47. else
  48. ex[i]=nex[i-a];
  49. }
  50. }
  51. int main()
  52. {
  53. ios_base::sync_with_stdio();
  54. cin.tie();
  55. int t;
  56. string S,T;
  57. scanf("%d",&t);
  58. while(t--)
  59. {
  60. int max_sum=-1e8;
  61. for(int i=;i<;i++)
  62. {
  63. scanf("%d",&v[i]);
  64. }
  65. cin>>S;
  66. int len=S.size();
  67. for(int i=;i<len;i++)
  68. {
  69. if(i==)
  70. w[i]=v[S[i]-'a'];
  71. else
  72. w[i]=w[i-]+v[S[i]-'a'];
  73. }
  74. T=S;
  75. reverse(T.begin(),T.end());
  76. getextend(S,T,extend1);
  77. getextend(T,S,extend2);
  78. for(int i=;i<len;i++)
  79. {
  80. int sum=;
  81. if(i+extend1[i]==len)
  82. sum+=w[len-]-w[i-];
  83. if(len-i+extend2[len-i]==len)
  84. sum+=w[i-];
  85. max_sum=max(max_sum,sum);
  86. }
  87. printf("%d\n",max_sum);
  88. }
  89. }

拓展KMP求回文串的更多相关文章

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

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

  2. Palindrome - URAL - 1297(求回文串)

    题目大意:RT   分析:后缀数组求回文串,不得不说确实比较麻烦,尤其是再用线段数进行查询,需要注意的细节地方比较多,比赛实用性不高......不过练练手还是可以的.   线段数+后缀数组代码如下: ...

  3. 马拉车,O(n)求回文串

    马拉车,O(n)求回文串 对整个马拉车算法步骤做个总结: 第一步:将每个原字母用两个特殊字符包围如: aaa --> #a#a#a# abab -->#a#b#a#b 同时可以由这个翻倍的 ...

  4. 2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对)

    2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对) https://www.luogu.com.cn/problem/P5041 题意: 给一个字符串 \(S\) ,每 ...

  5. 3676: [Apio2014]回文串 求回文串长度与出现次数的最大值

    「BZOJ3676」[Apio2014] 回文串   Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所 ...

  6. manacher算法,求回文串

    用来求字符串最长回文串或者回文串的总数量 #include<map> #include<queue> #include<stack> #include<cma ...

  7. hdu 3294 manacher 求回文串

    感谢: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/ O(n)求给定字符串的以每个位置为中心的回文串长度. 中心思想:每次计算位 ...

  8. hihocoder 1032 manachar 求回文串O(n)

    #include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...

  9. HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

    题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...

随机推荐

  1. Linux 常用指令总结

    一. 与时间有关的参数: 1.find 基本语法参数如下: find [PATH] [option] [action] -mtime n : n为数字,意思为在n天之前的“一天内”被更改过的文件: - ...

  2. docker内的服务无法获取用户真实IP

    原文:blog.baohaipeng.top 背景:MySQL数据库和Redis运行在宿主机上(Linux),server运行在docker内,web运行在Nginx内(Nginx运行在docker内 ...

  3. 慎用margin系列2---ie6双倍边距问题

    IE6下有一个著名的margin双倍bug 一.什么是双边距Bug? 先来看图: 我们要让绿色盒模型在蓝色盒模型之内向左浮动,并且距蓝色盒模型左侧100像素.这个例子很常见,比如在网页布局中,侧边栏靠 ...

  4. js中函数的创建和调用都发生了什么?执行环境,函数作用域链,变量对象

    博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/11/26/js%E4%B8%AD%E5%87%BD%E6%95%B0%E7%9A%84%E ...

  5. zabbix--External checks 外部命令检测

    概述zabbix server 运行脚本或者二进制文件来执行外部检测,外部检测不需要在被监控端运行任何 agentditem key 语法如下: 参数 定义 script shell 脚本或者二进制文 ...

  6. fixture实战---通过fixure,解决方法依赖逻辑

    import pytest@pytest.fixture()def login(): print('输入用户名密码登陆') def test_cart(login): print('用例1,登陆后执行 ...

  7. 自定义input[type="radio"]

    对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一. 对单选按钮自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :c ...

  8. android meta_data配置数据

  9. stdio - 标准输入输出库函数

    SYNOPSIS 总览 #include <stdio.h> FILE *stdin; FILE *stdout; FILE *stderr; DESCRIPTION 描述 标注 I/O ...

  10. sort -n

    输入如下测试数据:  当按照第一列排列时是正确的:  但按照第二列排序时,喵喵喵???怎么跟说好的不一样啊!!!为什么gugu的50会排在最后?  其实是因为默认是按照第二列的第一个字符来比较的,若想 ...