【GDOI2016模拟3.15】基因合成
  • 题意:

    • 给一个目标串,要求从空串进行最少的操作次数变成目标串,操作有两种:
    • 在串的头或尾加入一个字符.
    • 把串复制一遍后反向接到串的末尾.
  • 因为有回文操作,所以可以想到一些与回文有关的东西.

  • 如Manacher,回文树……

  • 这里采用强大的回文树.

  • 首先注意到目标串可以看作是由一个长度为偶数的回文串在首尾加上若干字符得到的一个串.

  • 所以我们可以求出原串中所有的偶回文串,然后再加加减减一下.

  • 但为什么长度为奇数的不用讨论呢?

  • 这是因为长度为奇数的回文串不可能通过第二个操作得到,所以不管如何,它对答案都没有贡献,它只能通过一个字符一个字符的加得到,尽管它的子串里可能有长度为偶数的回文串,但长度为偶数的回文串无论如何不可能通过第二个操作变为长度为奇数的回文串,所以我们依然可视作它是一个字符一个字符加入的.

  • 然后我们继续讨论长度为偶数的回文串.

  • 首先它可以由它的父亲状态得来,也就是在它父亲状态的最少操作数上+1得到.

  • 当然,它也可以由一个不超过其自身长度一般的最长回文后缀进行一些操作后得来.

  • 两者取最小值即为此偶回文串的最少操作数.

  • 这实质上就是个在回文树上DP的东西.

  • 现在问题还存在的是如何找到一个不超过其自身长度一半的偶回文串.

  • 这一点我们可以借鉴回文树求\(fail\)的过程,我们设一个\(trans\)表示类似的东西,只不过多一个限制就是不能超过其长度一半.

  • 然后每次从一个状态的父亲状态的\(trans\)开始找起来.

  • 同样可以势能分析,时间复杂度显然是\(O(n)\)的.

  • 当然,还可以打倍增....不过比较蛋疼。。。

#include <cstdio>
#include <cstring>
#include <iostream> #define I register int
#define F(i, a, b) for (I i = a; i <= b; i ++)
#define mem(a, b) memset(a, b, sizeof a)
#define mn(a, b) ((a) = (a) < (b) ? (a) : (b)) const int N = 1e5 + 10, M = 26; using namespace std; int T; char ch[N];
int cur, lens, las, p, now, ans, len[N], fail[N], son[N][M], f[N], trans[N]; int Node(I x) { len[p] = x; return p ++; } int getfail(I x) { while (ch[now] ^ ch[now - len[x] - 1]) x = fail[x]; return x; } void Add(I x) {
cur = getfail(las);
if (!son[cur][x]) {
I t = Node(len[cur] + 2);
fail[t] = son[getfail(fail[cur])][x];
son[cur][x] = t;
}
las = son[cur][x]; if (len[las] & 1)
f[las] = len[las];
else
{
f[las] = f[cur] + 1;
I k = trans[cur];
while (ch[now - len[k] - 1] ^ ch[now] || (len[k] + 2) * 2 > len[las]) k = fail[k];
trans[las] = son[k][x];
mn(f[las], f[trans[las]] + len[las] / 2 - len[trans[las]] + 1);
} mn(ans, f[las] + lens - len[las]);
} int main() {
for (scanf("%d", &T); T --; ) {
scanf("%s", ch + 1); p = 0, lens = strlen(ch + 1); Node(0), Node(- 1), f[0] = 1; fail[0] = 1, las = 0, ans = 1e9; F(i, 1, lens) now = i, Add(ch[i] - 'A'); printf("%d\n", ans); F(i, 0, p + 2) mem(son[i], 0);
}
}

【GDOI2016模拟3.15】基因合成(回文串+性质+DP)的更多相关文章

  1. 关于回文串的DP问题

    问题1:插入/删除字符使得原字符串变成一个回文串且代价最小 poj 3280 Cheapest Palindrome 题意:给出一个由m中字母组成的长度为n的串,给出m种字母添加和删除花费的代价,求让 ...

  2. 回文串 --- 动态dp UVA 11584

    题目链接: https://cn.vjudge.net/problem/34398/origin 本题的大意其实很简单,就是找回文串,大致的思路如下: 1. 确定一个回文串,这里用到了自定义的chec ...

  3. poj3280 Cheapest Palindrome(回文串区间dp)

    https://vjudge.net/problem/POJ-3280 猛刷简单dp第一天第三题. 这个据说是[求字符串通过增减操作变成回文串的最小改动次数]的变体. 首先增减操作的实质是一样的,所以 ...

  4. 1154 回文串划分(DP+Manacher)

    1154 回文串划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. ...

  5. uva 10453 【回文串区间dp】

    Uva 10453 题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果. 题解:和Uva 10739类似,这里是只能增加.类似定义dp[i][j]表示子串Si...Sj变为回文串 ...

  6. [LeetCode] Palindrome Partitioning 拆分回文串

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

  7. 【Manacher算法】最长子回文串

    [Manacher算法] 这个算法用来找出一个字符串中最长的回文子字符串. 如果采取暴力解最长回文子字符串问题,大概可以有两种思路:1. 遍历出所有子字符串找其中最长的回文 2. 从每个字符作为中心, ...

  8. 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树

    腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...

  9. 马拉车,O(n)求回文串

    马拉车,O(n)求回文串 对整个马拉车算法步骤做个总结: 第一步:将每个原字母用两个特殊字符包围如: aaa --> #a#a#a# abab -->#a#b#a#b 同时可以由这个翻倍的 ...

随机推荐

  1. 测者的性能测试手册:Web压力测试工具webbench

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: wget http:/ ...

  2. ORACLE中如何查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析.总结一下. 1:使用ORA_ROWSCN伪列获取表最后的DML时间 ORA_ ...

  3. mysql面试题

    01. 列举常见的关系型数据库和非关系型都有那些? 1.关系型数据库通过外键关联来建立表与表之间的关系,---------常见的有:SQLite.Oracle.mysql 2.非关系型数据库通常指数据 ...

  4. 日志学习系列(三)——NLog基础知识

    前边我们解释了log4net的学习,我们再介绍一下NLog 一.什么是NLog NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog是一个简单 ...

  5. Windows Service 学习系列(一):建立简单的Windows service

    参考:https://www.cnblogs.com/cncc/p/7170951.html 一.开发环境 操作系统:Windows 7 X64 开发环境:VS2017 编程语言:C# .NET版本: ...

  6. Hadoop Yarn配置项 yarn.nodemanager.resource.local-dirs探讨

    1. What is the recommended value for "yarn.nodemanager.resource.local-dirs"? We only have ...

  7. solr 7.7 搭建和搜索

    最近做了个solr搜索的demo, 用的是solr7.7,之前网上好多文章搭建solr都是5.5+tomcat.. 自己摆弄了下,发现solr7.7和5.5 的部分文件夹有些改动,没有深究原理也就没有 ...

  8. 2019-04-15 python深浅复制

    原作地址:https://www.cnblogs.com/xueli/p/4952063.html 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,pyth ...

  9. AI AutoML

    AutoML 参考链接: https://arxiv.org/pdf/1810.13306.pdf http://nooverfit.com/wp/7%E4%B8%AA%E4%BD%A0%E5%8F% ...

  10. Selenium自动化测试之学会元素定位

    这是我经常被问到的一个问题,也是我很讨厌回答的问题,因为要想回答这个问题需要知道上下文.什么样式的元素,有哪些属性,是否有表单嵌套,都尝试了哪些定位方法...而且没几个提问者能事先详细的说明这些.哪儿 ...