递推预处理 + Manacher
链接:https://www.nowcoder.com/acm/contest/131/D
来源:牛客网
删除字符串的第一个字母。
删除字符串的最后一个字母。
在字符串的头部添加任意一个你想要的字母。
在字符串的尾部添加任意一个你想要的字母。
删除一个第 i 种英文字母需要的花费是 Ai,添加一个第 i 种英文字母的花费是 Bi。
请问将字符串 S 变成回文串需要的最小花费是多少?
输入描述:
第一行输入一个字符串 S。
接下来 26 行,每行输入两个正整数 A
i
和 B
i
,表示删除一个第 i 种字符所需的花费以及添加一个第 i 种字符所需的花费。
1≤ |S| ≤ 10
5
且字符串 S 中只包含小写英文字母 1≤ A
i
,B
i
≤ 109.
输出描述:
输出一个正整数,表示把字符串 S 变成一个回文串的最小花费。
输入
jelly
1000 1100
350 700
200 800
2000 2000
2000 432
2000 2000
2000 2000
2000 2000
2000 2000
20 2000
2000 2000
350 35
200 800
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
15 2000
2000 2000
输出
105 题意 : 给你一个字符串,每次只能在两端操作,增加一个字符或删掉一个字符,将其变成最长回文串
思路分析:一个马拉车可以预处理处理以每个位置为中心开始的最长回文子串,然后接下来的操作就是将一侧全部去掉,另一侧选择性的补齐一部分即可,每次补齐操作都是针对到两个边界的区间的,因此可以直接预处理处理
代码示例:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn = 1e5+5; char s[maxn], now[maxn*2];
ll a[30], b[30];
ll len;
ll qa[maxn], qb[maxn], ha[maxn], hb[maxn];
ll qs[maxn], hs[maxn];
ll p[2*maxn]; void init() {
for(ll i = 1; i <= len; i++) qa[i] = qa[i-1]+a[s[i]-'a'];
for(ll i = 1; i <= len; i++) qb[i] = qb[i-1]+b[s[i]-'a']; for(ll i = len; i >= 1; i--) ha[i] = ha[i+1]+a[s[i]-'a'];
for(ll i = len; i >= 1; i--) hb[i] = hb[i+1]+b[s[i]-'a']; ll pos = 0; for(ll i = 1; i <= len; i++){
if (qa[i] < qa[pos]+qb[i]-qb[pos]){
pos = i;
qs[i] = qa[i];
}
else qs[i] = qa[pos]+qb[i]-qb[pos];
} pos = len+1;
for(ll i = len; i >= 1; i--){
if (ha[i] < ha[pos]+hb[i]-hb[pos]){
pos = i;
hs[i] = ha[i];
}
else hs[i] = ha[pos]+hb[i]-hb[pos];
}
} void Manacher()
{
for (ll i=1;i<=len;i++) now[2*i-1]='%',now[2*i]=s[i];
now[len=len*2+1]='%';
ll pos=0,R=0;
for (ll i=1;i<=len;i++)
{
if (i<R) p[i]=min(p[2*pos-i],R-i); else p[i]=1;
while (1<=i-p[i]&&i+p[i]<=len&&now[i-p[i]]==now[i+p[i]]) p[i]++;
if (i+p[i]>R) {pos=i;R=i+p[i];}
}
} int main () {
scanf("%s", s+1);
len = strlen(s+1); for(ll i = 0; i < 26; i++) scanf("%lld%lld", &a[i], &b[i]);
init();
Manacher(); ll ans = (1ll)<<60;
ll l, r;
for(ll i = 1; i <= len; i++){
p[i]--;
if (i%2){
ll ff = p[i]/2;
l = i/2-ff, r = i/2+ff+1;
}
else {
ll ff = p[i]/2;
l = i/2-ff-1, r = i/2+ff+1;
} ans = min(ans, qa[l]+hs[r]);
ans = min(ans, ha[r]+qs[l]);
//printf("%lld %lld %lld\n",l, r, ans);
}
printf("%lld\n", ans);
return 0;
}
递推预处理 + Manacher的更多相关文章
- Codeforces Round #271 (Div. 2) D. Flowers (递推 预处理)
We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, as we all kn ...
- HDU 4834 JZP Set(数论+递推)(2014年百度之星程序设计大赛 - 初赛(第二轮))
Problem Description 一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S.例如,n=3,S={1 ...
- CodeForces 429 B Working out(递推dp)
题目连接:B. Working out 我想了很久都没有想到怎么递推,看了题解后试着自己写,结果第二组数据就 wa 了,后来才知道自己没有判选择的两条路径是否只是一个交点. 大概思路是:先预处理出每个 ...
- 【递推】【DFS】【枚举】Gym - 101246C - Explode 'Em All
网格里放了一些石块,一个炸弹能炸开其所在的行和列.问炸光石块至少要几个炸弹. 枚举不炸开的行数,则可以得出还要炸开几列. 为了不让复杂度爆炸,需要两个优化. 先是递推预处理出f(i)表示i的二进制位中 ...
- 利用Cayley-Hamilton theorem 优化矩阵线性递推
平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- HDU-4651 Partition 整数拆分,递推
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:求n的整数拆为Σ i 的个数. 一般的递归做法,或者生成函数做法肯定会超时的... 然后要 ...
- 【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
1002: [FJOI2007]轮状病毒 Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同 ...
- BZOJ4451 [Cerc2015]Frightful Formula 多项式 FFT 递推 组合数学
原文链接http://www.cnblogs.com/zhouzhendong/p/8820963.html 题目传送门 - BZOJ4451 题意 给你一个$n\times n$矩阵的第一行和第一列 ...
随机推荐
- 高并发下载tomcat下的文件时,发生java.net.SocketException: Connection reset解决方案
(1)问题产生:使用500个线程并发下载tomcat工程中的一个文件时,服务器出现java.net.SocketException: Connection reset异常, 客户端出现connect ...
- tf.train.match_filenames_once()
文件匹配之用 官方解释: 调用样例: https://bbs.csdn.net/topics/392271556 返回值样例:
- cookie小总结
对cookie总结 cookie 在服务器的环境下,对数据的本地存储下面为一个小小的案例 let d= new Date; d.setDate(d.getDate()+7); document.coo ...
- Linux 内核 PCI 总线
任何在 PCI 总线上的设备有参数 name 和 SUBSYSTEM 环境变量设置为值 pci. PCI 子系 统也一直添加下面 4 个环境变量: PCI_CLASS 设备的 PCI 类号, 16 进 ...
- HDU6581 Vacation (HDU2019多校第一场1004)
HDU6581 Vacation (HDU2019多校第一场1004) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6581 题意: 给你n+1辆汽车, ...
- k8s数据持久化实验
Step 1:创建PV ============================================ apiVersion: v1kind: PersistentVolumemetadat ...
- [转]SIMD、MMX、SSE、AVX、3D Now!、NEON
转载来源<[整理]SIMD.MMX.SSE.AVX.3D Now!.neon> 本文摘取部分内容,详细请看原文. SIMD NEON是通用的SIMD(单指令多数据)引擎. 对于SISD,每 ...
- HDU 2068 RPG错排 [错排公式]
1.题意:1到N的序列的排列中,元素位置与元素值相对应的情况(值为i的元素在某个排列中正好排在第i个位置)大于等于序列规模一半的情况,有多少个? 2.输入输出:每组数据一个数,N,规定输入以0结尾: ...
- Spring+dubbo错误(一)
10-21 20:51:39.593 ERROR [ContextLoader.java:351] Context initialization failed org.springframework. ...
- Java程序员必备:异常的十个关键知识点
前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...