题目来源:HDU 3613 Best Reward

题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大

思路:考虑扩展KMP 输出a串 得到a的反串b 求出f[0]和f[1] 和 extend[0]和extend[1] 正反求2次

枚举位置i 分成2部分0到i-1 和i到n-1 由于分成的2部分必须组成原字符串 就是不能多也不能少

那么推断i+extend[i]是否等于n 等于说明i到n-1这个部分是回文串 sum1 为这部分的值 假设这部分不是回文sum1 = 0

推断0到i-1是不是回文 将a和b翻转 那么就和推断i到n-1是一样的  所以上面正反求了2次 sum2 为这部分的值 假设这部分不是回文sum2 = 0

去sum1+sum2的最大值 另外字符串的值能够递推求得

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 500010;
int f[2][maxn], ex[2][maxn];
char a[maxn], b[maxn];
int id[26], dp[2][maxn];
void getFail(char* s, int id, int n)
{
int k = 1, p = 0;
while(p+1 < n && s[p] == s[p+1])
p++;
f[id][0] = n;
f[id][1] = p;
for(int i = 2; i < n; i++)
{
int l = f[id][i-k];
int p = f[id][k]+k-1;
if(i+l-1 < p)
f[id][i] = l;
else
{
int j = p-i+1;
if(j < 0)
j = 0;
while(i+j < n && s[i+j] == s[j])
j++;
f[id][i] = j;
k = i;
}
}
} void getEx(char* s, char* t, int id, int n)
{
int k = 0, p = 0;
while(p < n && s[p] == t[p])
p++;
ex[id][0] = p;
for(int i = 1; i < n; i++)
{
int l = f[id^1][i-k];
int p = ex[id][k]+k-1;
if(i+l-1 < p)
ex[id][i] = l;
else
{
int j = p-i+1;
if(j < 0)
j = 0;
while(i+j < n && s[i+j] == t[j])
j++;
ex[id][i] = j;
k = i;
}
}
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
for(int i = 0; i < 26; i++)
scanf("%d", &id[i]);
scanf("%s", a);
int n = strlen(a); for(int i = 0; i < n; i++)
{
b[i] = a[n-i-1];
if(i)
dp[0][i] = id[a[i]-'a'] + dp[0][i-1];
else
dp[0][i] = id[a[i]-'a'];
}
for(int i = 0; i < n; i++)
{
if(i)
dp[1][i] = dp[1][i-1] + id[b[i]-'a'];
else
dp[1][i] = id[b[i]-'a'];
}
getFail(a, 0, n);
getFail(b, 1, n);
getEx(a, b, 0, n);
getEx(b, a, 1, n);
int ans = 0;
for(int i = 1; i < n; i++)
{
int sum1 = 0, sum2 = 0;
if(i+ex[0][i] == n)
sum1 = dp[1][ex[0][i]-1];
int j = n-i;
if(j+ex[1][j] == n)
sum2 = dp[0][ex[1][j]-1];
ans = max(ans, sum1+sum2);
//printf("%d %d\n", ex[0][i], ex[1][i]);
}
printf("%d\n", ans);
}
return 0;
}

HDU 3613 Best Reward 正反两次扩展KMP的更多相关文章

  1. HDU - 3613 Best Reward(manacher或拓展kmp)

    传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...

  2. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  3. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

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

  4. hdu 3613"Best Reward"(Manacher算法)

    传送门 题意: 国王为了犒劳立下战功的大将军Li,决定奖给Li一串项链,这个项链一共包含26中珠子"a~z",每种珠子都有 相应的价值(-100~100),当某个项链可以构成回文时 ...

  5. HDU 3613 Best Reward(扩展KMP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3613 [题目大意] 一个字符串的价值定义为,当它是一个回文串的时候,价值为每个字符的价值的和,如果 ...

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

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

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

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

  8. hdu 3613 Best Reward

    After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...

  9. hdu 3613 Best Reward (manachar算法)

    Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Prob ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之1039移动

          题目 解决代码及点评 /* 39. 有n个整数,编程序将前面的各个数依次向后移动k个位置, 最后k个数移到最前边的k个位置(见下图,其中n=8,k=3). */ # ...

  2. if(男深圳集体户口&&女非深圳户口)深圳准生证办理材料及流程

    所需材料 一.女方需要办理流动人口婚育证明(蓝色的小本本). 办理材料.各地可能不同.这个是在女方的户籍所在地办理(最好在女方户籍所在地办理女方初婚未育证明). 二.男方在公司开出初婚未育证明. 三. ...

  3. SEO分享:我为什么会有这么多的优质外链资源?

    前面小浪发了一篇文章" [完整版]我是怎样3个月把800指数的词做上首页的.",非常多人看了之后都表示非常佩服.顽强的运行力.确实SEO就是要顽强的运行力,也有人说吹牛吧,一天50 ...

  4. UVA 322 ships (POJ 1138)

    题目地址: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  5. asp.net2.0安全性(3)--验证与授权--转载来自车老师

    "验证"与"授权"是对网页资源安全管理的两道门. 验证(Authentication):检查用户是否是合法的用户.就像是网站大门口的保卫,服责验证使用的用户名和 ...

  6. 在纯C工程的main函数之前跑代码(手工找到程序入口点, 替换为我们自己的函数)

    在main函数之前跑代码的方法 方法: 手工找到程序入口点, 替换为我们自己的函数 写测试程序 // test.cpp : Defines the entry point for the consol ...

  7. Windows Azure入门教学系列 (二):部署第一个Web Role程序

    本文是Windows Azure入门教学的第二篇文章. 在第一篇教学中,我们已经创建了第一个Web Role程序.在这篇教学中,我们将学习如何把该Web Role程序部署到云端. 注意:您需要购买Wi ...

  8. 基于visual Studio2013解决C语言竞赛题之1084完全平方数

        题目 解决代码及点评 /************************************************************************/ /* ...

  9. python web with bottle and session (beaker)

    python web with bottle and session (beaker) http://icodesnip.com/snippet/python/python-web-with-bott ...

  10. 性能测试之LoardRunner 自动关联

    1.什么是自动关联? 2.实例介绍 以下是详细介绍: 自动化关联:它是VuGen提供的自动化扫描关联处理策略,它的原理是对同一个脚本运行和录制时的服务器返回进行比较,来自动查找变化的部分,并且提示是否 ...