博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Manacher][HDU3613][Best Reward]
阅读量:7238 次
发布时间:2019-06-29

本文共 1219 字,大约阅读时间需要 4 分钟。

题意:

将一段字符串 分割成两个串
如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0。
问如何分割,使得两个串权值之和最大

思路:

裸的:
枚举分割点,计算,O(n) 判断是否回文
总复杂度O(n^2)
优化:
利用Manacher的预处理 O(1)判断是否回文
复杂度O(n)

//Manacher/*  ** 求最长回文子串 */ #include 
#include
#include
#include
using namespace std;const int MAXN=550000;char Ma[MAXN*2];int Mp[MAXN*2];void Manacher(char s[],int len){ int l=0; Ma[l++]='$'; Ma[l++]='#'; for(int i=0;i
i?min(Mp[2*id-i],mx-i):1; while(Ma[i+Mp[i]]==Ma[i-Mp[i]]) Mp[i]++; if(i+Mp[i]>mx){ mx=i+Mp[i]; id=i; } }} /* * abaaba * i: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 *Ma[i]: $ # a # b # a # a # b # a # *Mp[i]: 1 1 2 1 4 1 2 7 2 1 4 1 2 1 */char s[MAXN];int sum[MAXN*2];int v[30];void input(){ for(int i=1;i<=26;i++) scanf("%d",&v[i]); scanf("%s",s);}void get_sum(){ int len=strlen(Ma); for(int i=1;i
=(i-1)) a1=sum[i]-sum[1]; if(((len+i-1)/2-Mp[(len+i-1)/2]+1)<=(i+1)) a2=sum[len-2]-sum[i]; if(ans
>T; while(T--) { input(); solve(); }}

转载于:https://www.cnblogs.com/zy691357966/p/5480314.html

你可能感兴趣的文章
淘宝大秒系统设计详解
查看>>
Android 类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现...
查看>>
freemarker最新的插件
查看>>
SQL代码自动生成器
查看>>
svn最厉害入门教程
查看>>
类似心跳的动画缩放
查看>>
Oracle DBA课程系列笔记(7_1)
查看>>
RedHat EL5 安装Oracle 10g RAC之--系统环境配置(1)
查看>>
用组策略如何去掉Windows 2003开机组合键
查看>>
Ext.MessageBox.show()方法的使用
查看>>
HTML 标签收集整理
查看>>
我的友情链接
查看>>
ThinkPHP-空操作
查看>>
Mysql锁机制分析
查看>>
C# 通过委托实现两个程序集间的双向调用
查看>>
android源代码提示文本框还能输入多少个字符
查看>>
我奋斗了18年才和你坐在壹起喝咖啡
查看>>
浦发银行网上银行系统不再支持 Firefox / Chrome 浏览器了
查看>>
silverlight数据绑定 故事板
查看>>
我的友情链接
查看>>