scut 125. 笔芯回文
看数据量,这题可能是O(n^2)的dp
也可能是区间dp,但是区间dp一般复杂度是O(n^3),虽然也可以优化,但是比赛的时候那么多人“秒”了,应该不会是那么麻烦的。
套路:设dp[i]表示前i个字符中能拿到的最大贡献。dp[len]就是答案。
如果[L, R]这段区间能组成回文串,那么就有两种决策,删除或则不删除。
删除:dp[R] = dp[L - 1] + a[R - L + 1]
不: dp[R] = dp[R];
取个max就行。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = 1e5 + ;
int a[maxn];
LL dp[maxn];
char str[maxn], sub[maxn];
int p[maxn];
int manacher(char str[], int lenstr) {
str[] = '*'; //表示一个不可能的值
//目标要插入lenstr+1个'#',所以长度变成2*lenstr+1
for (int i = lenstr; i >= ; i--) { //str[lenstr+1]是'\0'
//i=lenstr时,i+i+2那个值要赋为'\0';
//总长度只能是lenstr+lenstr+2,所以i从lenstr开始枚举
str[i + i + ] = str[i + ];
str[i + i + ] = '#';
}
int id = , maxlen = ; //现在开始在str[2]了
for (int i = ; i <= * lenstr + ; i++) { //2*lenstr+1是'#'没用
if (p[id] + id > i) { //没取等号的,只能去到p[id]+id-1
//p[id]+id是越界的,减去i即为区间长度
//p[id]+id-i,这个是所有可能中的最大值了
p[i] = min(p[id] + id - i, p[ * id - i]);
} else p[i] = ; //记得修改的是p[i]
while (str[i + p[i]] == str[i - p[i]]) ++p[i];
if (p[id] + id < p[i] + i) id = i;
maxlen = max(maxlen, p[i]);
}
return maxlen - ;
}
bool isok(int be, int en) {
int len = en - be + ;
be <<= ;
en <<= ;
int mid = (be + en) >> ;
return p[mid] - >= len;
}
void work() {
int n;
cin >> n;
for (int i = ; i <= n; ++i) cin >> a[i];
memset(dp, , sizeof dp);
cin >> str + ;
int lenstr = strlen(str + );
strcpy(sub + , str + );
manacher(str, lenstr);
for (int i = ; i <= lenstr; ++i) {
for (int j = ; j <= i; ++j) {
if (i - j + > n) continue;
if (isok(j, i)) {
dp[i] = max(dp[i], dp[j - ] + a[i - j + ]);
}
}
}
cout << dp[lenstr] << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
cin >> t;
while (t--) work();
return ;
}
scut 125. 笔芯回文的更多相关文章
- SCUT 125 :笔芯回文(DP)
https://scut.online/p/125 125. 笔芯回文 题目描述 bxbx有一个长度一个字符串SS,bxbx可以对其进行若干次操作. 每次操作可以删掉一个长度为k(1 \leq k \ ...
- 前端与算法 leetcode 125. 验证回文串
目录 # 前端与算法 leetcode 125. 验证回文串 题目描述 概要 提示 解析 解法一:api侠 解法二:双指针 算法 传入测试用例的运行结果 执行结果 GitHub仓库 查看更多 # 前端 ...
- Java实现 LeetCode 125 验证回文串
125. 验证回文串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, ...
- SCUT125 华为杯 D.笔芯回文 —— DP
题目链接: https://scut.online/p/125 题目描述 bxbx有一个长度一个字符串SS,bxbx可以对其进行若干次操作. 每次操作可以删掉一个长度为k(1 \leq k \leq ...
- 力扣(LeetCode)125. 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...
- leetcode 125 验证回文字符串 Valid Palindrome
验证回文字符串 C++ 思路就是先重新定义一个string ,先遍历第一遍,字符串统一小写,去除空格:然后遍历第二遍,首尾一一对应比较:时间复杂度O(n+n/2),空间O(n); class Solu ...
- leetcode 125. 验证回文串(python)
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...
- leetcode.字符串.125验证回文串-Java
1. 具体题目 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写.说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a pl ...
- Leetcode 125.验证回文字符串(Python3)
题目: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, ...
随机推荐
- tf.stack和tf.unstack
import tensorflow as tf a = tf.constant([1,2,3]) b = tf.constant([4,5,6]) c1 = tf.stack([a,b],axis=0 ...
- bzoj3312
K个硬币,要买N个物品. 给定买的顺序,即按顺序必须是一路买过去,当选定买的东西物品序列后,付出钱后,货主是不会找零钱的.现希望买完所需要的东西后,留下的钱越多越好,如果不能完成购买任务,输出-1 $ ...
- 每天一个Linux命令:目录
版权声明 更新:2017-04-19博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 在使用Linux的过程中总是发现有一些L ...
- jquery.one()
one() 方法为被选元素附加一个或多个事件处理程序,并规定当事件发生时运行的函数. 当使用 one() 方法时,每个元素只能运行一次事件处理器函数. 也就是,绑定的function,只会执行一次. ...
- bzoj 4592(洛谷 4344) [Shoi2015]脑洞治疗仪——线段树上二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解 ...
- snmp++开发实例一
1.官网下载 snmp开发,首先需要机器已经安装了snmp服务,这方面的资料网上比较完备,安装的时候注意每少一个文件,网上都可以下载到,这样可以自己形成一个包,供以后使用.只要最后snmp的服务开启就 ...
- AngularJs(Part 2)
I am still tired to translate these into Chinese. but who cares? i write these posts just for myself ...
- WPF ChangePropertyAction中TargetName和TargetObject的区别
在wpf页面布局中经常用到ChangePropertyAction来更改属性,在这个里面有TargetName和TargetObject两个属性,都表示需要修改的控件名称,那么这两个有什么区别呢,通过 ...
- xgene:WGS,突变与癌,RNA-seq,WES
人类全基因组测序06 SNP(single nucleotide polymorphism):有了10倍以上的覆盖深度以后,来确认SNP信息,就相当可靠了. 一个普通黄种人的基因组,与hg19这个参 ...
- openstack官方指导书
openstack官方网站:https://docs.openstack.org/ 由于openstack的官方文档有点多,所以这里对其进行梳理一下 Release Notes 发布版本 新功能,升级 ...