一、题目描述
测试数据:
input
3
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
qabccbadddefghhgfeddd
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
aba
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
acacac
output
14
1
6
二、算法分析说明与代码编写指导
题目坑点:
1、只需要切成两段。一开始我以为可以切成多段使总价值最大,搞到我想了半天没想出来。
2、value 居然有负的!坑爹啊!一开始我只看到个 value ≤ 100 搞到直接上 unsigned 类型,WA 得我很郁闷。
设项链长为 l。本题采用 Manacher 算法,然后以线性的时间复杂度枚举切割点共 (l - 1) 个,切成 [1, i] 和 [i + 1,l] 两段。如果以某段中心为中心的最长回文子串的长度与该段长度相等,那么这一段的价值是每一个宝石的价值之和,否则价值为 0。
Manacher 算法模板返回的是以字符串的每个位置的中心的回文子串的数量,长度要算出来。如果回文串具有 x(奇数个),那么长度为 2x - 1;如果回文串具有 y(偶数个),那么长度为 2y。
求一段项链的价值是求区间和,用前缀和处理一下,可以加快求和速率。
三、AC 代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;