KMP_Best Reward
大意:把一个字符串分成两串,假如一个字符串是回文串就可以加上它的VALUE,否则它的VALUE为0;
KMP的特点是可以求出前缀与后面的字符串是否匹配,
注意回文串的特点,所以当我们把回文串反转的时候会发现与前面的字符串匹配,
然后将字符串整个反转可以求出后缀的,
利用其特点可以快速判断回文串,
CODE;
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string.h>
#define N 500008
using namespace std;
typedef long long ll; char s[*N];
int next[*N];
int a[];
int sum[N*],pos[*N],pre[*N]; void get_next(char *s)//NEXT数组
{
next[]=-;
int k=-,i=;
int l=strlen(s);
while (i<l)
{
if (k==-||s[i]==s[k])
{
k++;i++;
next[i]=k;
}
else k=next[k];
}
} int main()
{
int cas;
scanf("%d",&cas); while (cas--)
{
memset(pos,,sizeof(pos));
memset(pre,,sizeof(pre));
for (int i=;i<;i++) scanf("%d",&a[i]);
scanf("%s",s); int len=strlen(s);
for (int i=;i<=len;i++) sum[i]=sum[i-]+a[s[i-]-'a'];//预先处理SUM数组,注意我们把A[I]的值移位了。
s[len]='#';
int k=len,l=len;
while (k) s[++l]=s[--k];//字符串反接在后面
s[++l]='\0';
get_next(s);
int dol=l;
while (next[dol]) {pre[next[dol]]=len+;dol=next[dol];}
for (int i=;i<len;i++)
swap(s[i],s[len++i]); get_next(s);
dol=l;
while (next[dol]) {pos[next[dol]]=len+;dol=next[dol];}; int ans=-;
for (int i=;i<len;i++)//核心代码,计算值
{
int ss=;
if (pre[i]==len+) ss+=sum[i];
if (pos[len-i]==len+) ss+=sum[len]-sum[i];
ans=max(ans,ss);
}
printf("%d\n",ans); }
return ;
}
KMP_Best Reward的更多相关文章
- ACM: hdu 2647 Reward -拓扑排序
hdu 2647 Reward Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- 回文串---Best Reward
HDU 3613 Description After an uphill battle, General Li won a great victory. Now the head of state ...
- hdu 2647 Reward
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2647 Reward Description Dandelion's uncle is a boss o ...
- Reward
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdoj 2647 Reward【反向拓扑排序】
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Reward HDU
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32 ...
- Reward(拓扑结构+邻接表+队列)
Reward Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- HDU 3613 Best Reward 正反两次扩展KMP
题目来源:HDU 3613 Best Reward 题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大 思路:考 ...
随机推荐
- ASP.NET Web API安全认证
http://www.cnblogs.com/codeon/p/6123863.html http://open.taobao.com/docs/doc.htm?spm=a219a.7629140.0 ...
- 国际制造执行系统(MES)应用与发展
某些专家认为,当今制造业的生存三要素是信息技术(IT).供应链管理(SCM)和成批制造技术.使用信息技术就是由依赖人工的作业方式转变为作业的快速化.高效化,大量减少人工介入,降低生产经营成本:供应链管 ...
- Map,HashMap
Map(映射),又称为字典(Dictionary),是由关键字(Key)及其对应的元素值(Value)所组成的元素单元(Element)的表单式集合. 通常,对于Map而言,使用给定的Key,可以迅速 ...
- SOCKET 地址
地址格式: 函数bind和getsockname使用通用数据类型:struct sockaddr*来指向socket地址. #incude <sys/socket.h> struct so ...
- android线程间通讯
近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...
- Azure SQL 数据库与新的数据库吞吐量单位DTU
azure中新的数据库吞吐量单位 (Database Throughput Unit, DTU) 是什么,以及用户如何通过它来了解新服务级别可以提供的服务内容.DTU 对于提供预测性更强的性能体验起着 ...
- web relase
http://wenku.baidu.com/link?url=uOAV9QwXGGLjeqt6M1KTqwp0Jbhhguvz9IxExCHNiUlrYMX584Io3ByNJJIkAVzEqzv9 ...
- node.js的学习
require('http') 内置模块 server.js var http = require('http'); function start(){ server = http.createSer ...
- 字符串流sstream[part2/使用同一个字符串流反复读写数据]
stringstream构造函数会特别消耗内存,似乎不打算主动释放内存(或许是为了提高效率),如果你要在程序中使用同一个流反复读写大量数据,将会造成大量的内部消耗,因此建议: 1:调用clear ...
- M1分数分配
进过第一轮迭代我们依据工作量及质量决定分配分数方案: 王皓南 24.5分 黄宇冰 24分 申开亮 23.5分 许晋 21分 王宇杰 17分 吴润凡 16分 巴丹益昔 14分