hdu3613
题解:
EX_KMP
网上似乎说kmp也可以,但是我交了一发代码没过
然后标记一下哪一些前缀和后缀会问
暴力枚举拆开了的位置
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=;
int v[],n,nxt[N],match[N],exnxt[N],exmatch[N];
int L[N],R[N];
char s[N],t[N];
void EXKMP(char s[],char t[],int n,int m)
{
exnxt[]=m;
for (int i=,po=;t[i];i++)
{
int P=po+exnxt[po];
exnxt[i]=max(min(exnxt[i-po],P-i),);
while (i+exnxt[i]<m&&t[exnxt[i]]==t[i+exnxt[i]])exnxt[i]++;
if (i+exnxt[i]>P) po=i;
}
for (int i=,po=;s[i];i++)
{
int P=po+exmatch[po];
exmatch[i]=max(min(exnxt[i-po],P-i),);
while (exmatch[i]<m&&i+exmatch[i]<n&&t[exmatch[i]]==s[i+exmatch[i]])exmatch[i]++;
if (i+exmatch[i]>P) po=i;
}
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
memset(exmatch,,sizeof exmatch);
for (int i=;i<;i++) scanf("%d",&v[i]);
scanf("%s",&s);
n=strlen(s);
if (n<)
{
puts("");
continue;
}
for (int i=;i<n;i++)t[n--i]=s[i];
t[n]='\0';
L[]=v[s[]-'a'];
for (int i=;i<n;i++)L[i]=L[i-]+v[s[i]-'a'];
R[n-]=v[s[n-]-'a'];
for (int i=n-;i>=;i--)R[i]=R[i+]+v[s[i]-'a'];
EXKMP(s,t,n,n);
for (int i=;i<n;i++)R[i]=(exmatch[i]==n-i)?R[i]:;
EXKMP(t,s,n,n);
for (int i=;i<n;i++)L[i]=(exmatch[n--i]==i+)?L[i]:;
int ans=;
for (int i=;i<n-;i++)ans=max(ans,L[i]+R[i+]);
printf("%d\n",ans);
}
return ;
}
hdu3613的更多相关文章
- hdu3613 Best Reward 扩展kmp or O(n)求最大回文子串
/** 题目:hdu3613 Best Reward 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意:有一个字符串,把他切成两部分. 如果这部 ...
- HDU3613 Best Reward —— Manacher算法 / 扩展KMP + 枚举
题目链接:https://vjudge.net/problem/HDU-3613 Best Reward Time Limit: 2000/1000 MS (Java/Others) Memor ...
- hdu3613 扩展KMP
#include<stdio.h> #include<string.h> #define maxn 501000 char s[maxn],t[maxn]; int next[ ...
- [扩展KMP][HDU3613][Best Reward]
题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 首先了解扩展kmp 扩展K ...
- [Manacher][HDU3613][Best Reward]
题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 裸的: 枚举分割点,计算, ...
- HDU3613 Manacher//EXKMP//KMP
http://acm.hdu.edu.cn/showproblem.php?pid=3613 每个字符都有一个权值,将一个字符串分成两半,如果某一半是回文串就把所有的字符权值加起来,否则当0来处理,问 ...
- hdu3613 Best Reward【Manacher】
Best Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu3613 Best Reward manacher+贪心+前缀和
After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...
- kuangbin专题十六 KMP&&扩展KMP HDU3613 Best Reward(前缀和+manacher or ekmp)
After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...
随机推荐
- CF 316E3 Summer Homework(斐波那契矩阵+线段树)
题目链接:http://codeforces.com/problemset/problem/316/E3 题意:一个数列A三种操作:(1)1 x y将x位置的数字修改为y:(2)2 x y求[x,y] ...
- Python3基础 str count 获得子字符串出现的次数
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化
题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...
- POJ 1236 Network of Schools(tarjan)题解
题意:一个有向图.第一问:最少给几个点信息能让所有点都收到信息.第二问:最少加几个边能实现在任意点放信息就能传遍所有点 思路:把所有强连通分量缩成一点,然后判断各个点的入度和出度 tarjan算法:问 ...
- PHP获取当前页面的网址
PHP获取当前页面的网址 function GetCurUrl() { $url = 'http://'; if(isset($_SERVER['HTTPS']) AND $_SERVER['HTTP ...
- Git项目创建与提交
创建Git密钥: 1.生成密钥: 右键–>Git Bash Here:先输入ssh-keygen –t rsa –C "邮箱地址",注意ssh-keygen之间是没有空格的, ...
- 2018提高组训练Day2
A 算法 1 对于每组询问,暴力的算出每个二次函数的取值. 时间复杂度 \(O(nq)\).期望得分 \(20\) 分. 算法 2 当 \(x>0\) 时,要求 \(a_ix^2+b_ix\) ...
- springmvc+druid+dataSource配置的两种方式
一.一般的配置方式 数据库连接配置在jdbc.properties文件中,这种方式有一个最大的缺点,数据库的配置信息对开发人员是完全可见的,十分方便程序员删库跑路.spring配置具体如下: 1.jd ...
- asp.net <asp:Repeater>下的 asp:LinkButton CommandArgument点击事件
前台 <asp:Repeater ID="rptData" runat="server" OnItemCommand="rptData_Item ...
- Cocos2d-x学习笔记(三)main方法
0. UNREFERENCED_PARAMETER(X)避免编译器关于未引用参数的警告. 下边代码用于屏蔽单个函数的警告: #pragma warning( push ) #pragma warnin ...