题目:hdu3613;

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

博客

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

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std;
const int max_=5e6+;
int extend1[max_],extend2[max_],v[],w[max_], nex[max_];
void getnext(string str)
{
int a=,p=;
int len=str.size(); nex[]=len;
for(int i=;i<len;i++)
{
if(i>=p||i+nex[i-a]>=p)
{
if(i>=p)
p=i;
while(str[p-i]==str[p]&&p<len)
p++;
nex[i]=p-i;
a=i;
}
else
nex[i]=nex[i-a];
}
}
void getextend(string str,string mo,int *ex)
{
int a=,p=;
getnext(mo);
int m=mo.size();
int len=str.size();
for(int i=;i<len;i++)
{
if(i>=p||i+nex[i-a]>=p)
{
if(i>=p)
p=i;
while(str[p]==mo[p-i]&&p<len&&p-i<m)
p++;
ex[i]=p-i;
a=i;
}
else
ex[i]=nex[i-a];
}
}
int main()
{
ios_base::sync_with_stdio();
cin.tie();
int t;
string S,T;
scanf("%d",&t);
while(t--)
{
int max_sum=-1e8;
for(int i=;i<;i++)
{
scanf("%d",&v[i]);
}
cin>>S;
int len=S.size();
for(int i=;i<len;i++)
{
if(i==)
w[i]=v[S[i]-'a'];
else
w[i]=w[i-]+v[S[i]-'a'];
}
T=S;
reverse(T.begin(),T.end());
getextend(S,T,extend1);
getextend(T,S,extend2);
for(int i=;i<len;i++)
{
int sum=;
if(i+extend1[i]==len)
sum+=w[len-]-w[i-];
if(len-i+extend2[len-i]==len)
sum+=w[i-];
max_sum=max(max_sum,sum);
}
printf("%d\n",max_sum);
}
}

拓展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. raid 5

    1. 添加硬盘设备 1.首先添加一块硬盘 2.选择磁盘类型 点击下一步   创建新的磁盘 更改磁盘大小 磁盘名称 完成以后硬盘出现在列表中 按上述步骤进行五次,新建五个硬盘如图 然后开启虚拟机 打开终 ...

  2. DNS域名解析服务以及Bind服务程序

    一般来讲域名比IP地址更加的有含义.也更容易记住,所以通常用户更习惯输入域名来访问网络中的资源,但是计算机主机在互联网中只能通过IP识别对方主机,那么就需要DNS域名解析服务了. DNS域名解析服务( ...

  3. docker swarm创建swarm集群

    三台linux主机 manager:192.168.100.151 work1:192.168.100.156 work2:192.168.100.157 manager docker swarm i ...

  4. MySQL用户管理及权限设置

    mysql 用户管理和权限设置 用户管理 mysql>use mysql; 查看 mysql> select host,user,password from user ; 创建 mysql ...

  5. redis 入门之哈希

    hset 将哈希表 hash 中域 field 的值设置为 value .如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作.如果域 field 已经存在于哈希表中, 那么它 ...

  6. Neo4J(Cypher语句)初识

    欢迎各路大神临幸寒舍 以下节点标签为people,friend,用户自己也可以设置成其他标签,查询时需要用到标签.这个标签可以类比为关系数据库中的表名 创建节点.关系 创建节点(小明):create ...

  7. iView + vue-quill-editor 实现一个富文本编辑器(包含图片,视频上传)

    1. 引入插件(注意IE10以下不支持) npm install vue-quill-editor --savenpm install quill --save (Vue-Quill-Editor需要 ...

  8. pytest-参数化2

    import pytesttest_user_data=['linda','sai','tom']@pytest.fixture(scope='module')def login(request): ...

  9. document.createDocumentFragment()的用法

    createDocumentFragment有什么作用呢? 调用多次document.body.append(),每次都要刷新页面一次.效率也就大打折扣了,而使用document_createDocu ...

  10. nginx匹配以XXX结尾的

    匹配以do结尾的所有文件:如http://192.168.126.168:8080/delivery/transportPlanData.do?startRelease=2019-07-06& ...