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 ...
随机推荐
- SQLException: com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ] has been closed()
问题:Could not get JDBC Connection; nested exception is java.sql.SQLException: com.mchange.v2.c3p0.Com ...
- AMS1117稳压模块
AMS1117有降压稳压的作用.我们使用的是AMS1117-5,输出5V电压. 理论参数: 输出条件 最小值 理论值 最大值 理论电路图: 引脚图:
- 九数组分数|2015年蓝桥杯B组题解析第五题-fishers
九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h> void t ...
- Winform中使用折叠窗口
使用此处的控件 http://www.codeproject.com/Articles/18401/XPanderControls 注意事项 使用之前需要先添加winform自带的toolStripC ...
- 【配置、开发】Spark入门教程[2]
本教程源于2016年3月出版书籍<Spark原理.机制及应用> ,在此以知识共享为初衷公开部分内容,如有兴趣,请支持正版书籍. Spark为使用者提供了大量的工具和脚本文件,使得其部署与开 ...
- 【附3】springboot源码解析 - 构建SpringApplication
package com.microservice.framework; import org.springframework.boot.SpringApplication; import org.sp ...
- yunw
- Pro Git读书笔记 - 分支
Git 分支介绍. 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线. 在很多版本控制系统中,这是一个略微低效的过程--常常需要完全创 ...
- Codeforces Round #223 (Div. 2) E. Sereja and Brackets 线段树区间合并
题目链接:http://codeforces.com/contest/381/problem/E E. Sereja and Brackets time limit per test 1 secon ...
- python 集合元素添加
#A new empty set color_set = set() color_set.add("Red") print(color_set) #Add multiple ite ...