[ZJOI 2013]丽洁体
Description
给出四个字符串 \(T,A,B,C\) ,问你至少在 \(T\) 串中删去几个单词能使得 \(T\) 串变为 \(A?B?C\) 的形式,其中 \(?\) 表示任意多的单词,可以为空。
\(1\leq |T|,|A|,|B|,|C|\leq 50000\) 。
Solution
首先注意到不同的字符串最多有 \(O(26^5)\) 个。我们可以先把字符串 \(hash\) ,方便处理。
其次,容易发现的是对于要满足 \(A,C\) 串的要求,直接贪心就好了,分别从串前和尾扫一遍。
我们考虑如何选 \(B\) 。我们先把 \(T\) 串中 \(A,C\) 相关的部分去掉。
一个显然的 \(DP\) 是记 \(f_{i,j}\) 为处理过的 \(T\) 串前 \(i\) 位选中了 \(B\) 串前 \(j\) 位要删去的最少单词数。但这样转移是 \(O(|T||B|)\) 的,能拿 \(70pts\) 。
转换思路。
设 \(f_i\) 表示第 \(i\) 位的字符最晚在 \(T\) 串的哪个位置出现; \(g_i\) 表示匹配前 \(i\) 位最少删除的字符。
注意到相同的字符最多只有 \(500\) ,我们可以暴力枚举所有的在 \(B\) 串中与 \(T_i\) 相同的位置。这样复杂度为 \(O(500|T|)\) 。
当然了,如果用相同的思想,枚举所有的在 \(B\) 串中与 \(T_i\) 相同的位置。用线段树优化 \(70pts\) 是可以做到 \(O(500|T|log_2 |B|)\) 。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 250000, M = 12356630, inf = 2e9;
char T[N+5], A[N+5], B[N+5], C[N+5];
int t[N+5], a[N+5], b[N+5], c[N+5], tt, ta, tb, tc, L, R, ans;
int f[N+5], g[N+5];
vector<int>s[M+5];
void get(char *ch, int *a, int &tot) {
int len = 0; char c;
while ((c = getchar()) != '\n') ch[++len] = c;
for (int i = 1, j; i <= len; i = j+1) {
int sum = 0; j = i;
while (ch[j] >= 'a' && ch[j] <= 'z') sum = sum*26+ch[j]-'a'+1, ++j;
a[++tot] = sum;
}
}
void work() {
get(T, t, tt);
get(A, a, ta);
get(B, b, tb);
get(C, c, tc);
for (int i = 1, loc = 1; i <= tt; i++) {
if (t[i] == a[loc]) ++loc;
else ans++;
if (loc == ta+1) {L = i+1; break; }
}
for (int i = tt, loc = tc; i >= 1; i--) {
if (t[i] == c[loc]) --loc;
else ans++;
if (loc == 0) {R = i-1; break; }
}
int sum = inf;
memset(g, 127/3, sizeof(g));
for (int i = 1; i <= tb; i++) s[b[i]].push_back(i);
for (int i = L; i <= R; i++)
for (int j = s[t[i]].size()-1; j >= 0; j--) {
int x = s[t[i]][j];
if (x == 1) f[x] = i, g[x] = 0;
else if (f[x-1]) f[x] = i, g[x] = g[x-1]+i-f[x-1]-1;
sum = min(sum, g[tb]);
}
printf("%d\n", sum+ans);
}
int main() {work(); return 0; }
[ZJOI 2013]丽洁体的更多相关文章
- [BZOJ3214][ZJOI2013]丽洁体(Hash+DP)
3214: [Zjoi2013]丽洁体 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 906 Solved: 335[Submit][Status] ...
- [luogu] P3333 [ZJOI2013]丽洁体(贪心)
P3333 [ZJOI2013]丽洁体 题目描述 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在 ...
- [ZJOI2013]丽洁体
题目描述 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做这种题,因为较其 ...
- bzoj 3214: [Zjoi2013]丽洁体
Description 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿 写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做 ...
- BZOJ3214 [Zjoi2013]丽洁体
题意 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做这种题,因为较其它题 ...
- 【BZOJ】3214: [Zjoi2013]丽洁体
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3214 字符串长度最大不超过$5$直接$HASH$起来 首先在$T$中考虑找到最前的一个包含 ...
- 并不对劲的bzoj3214:p3333:[ZJOI2013]丽洁体
题目大意 有三个由若干个单词组成的字符串\(T,A,B,C(|T|,|A|,|B|,|C|\leq 5*10^4,单词长度\leq5,每个单词出现次数\leq500)\) 求从\(T\)中至少删去多少 ...
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
- 数据结构(树套树):ZJOI 2013 K大数查询
有几个点卡常数…… 发现若第一维为位置,第二维为大小,那么修改时第一维修改区间,查询时第一维查询区间,必须挂标记.而这种情况下标记很抽象,而且Push_down不是O(1)的,并不可行. 那要怎么做呢 ...
随机推荐
- Django--入门篇:下载与项目生成
django作为python web应用开发最火的框架,没有之一,今天就给大家介绍django的一些入门知识. 我们选择pycharm工具,首先得要有django. 1.下载django --pip ...
- Redis——主从同步原理
刚接触到Redis,首先对Redis有一个初步的了解. 开源,免费,遵守BSD协议,key-value数据库. 可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用. 多种key-value类型 ...
- 利用yield 实现Xrange功能
def xrange(n): start = 0 while True: if start>n: return yield start start+=1 obj = xrange(5) n1 = ...
- WingIDE5.*注册破解方法
WingIDE是Python程序语言设计的集成开发环境,具有语法标签高亮显示,命令自动完成和函数跳转列表等非常强大的功能.本文主要介绍WingIDE 5安装及注册破解方法. 1. WingIDE 5下 ...
- Linux之用户与用户组
1.Linux是一种 多用户多任务分时操作系统. 2.Linux的用户只有两个等级:root用户和非root用户. Linux系统默认 内置了root用户 和一些非root用户,如nobody,a ...
- Linq 连接运算符:Concat
//Concat()方法附加两个相同类型的序列,并返回一个新序列(集合)IList<string> strList = new List<string>() { "O ...
- 24.C++- 抽象类(存虚函数)、接口、多重继承
抽象类和接口 什么是抽象类 用来表示现实世界中的抽象概念 是一种只能定义类型,而不能产生对象的类 只能被子类继承,且抽象类的相关成员函数没有完整的体现,用来被子类重写. 比如图形(Shape)类, 就 ...
- IDE-Ecplise-代码注释 模版 编码规范 配色
说明: 代码注释主要用于方便代码后期维护,编码规范,增加代码阅读性和维护性.因网上看到的很多博客中片段局多,故整理后重写一篇,方便交流学习. 先看下加过注释模版后的效果. 如上图所示,创建类,方法和继 ...
- asp.net(C#)实现功能强大的时间日期处理类完整实例
作者:smartsmile2012 字体:[增加 减小] 类型:转载 时间:2016-06-30我要评论 这篇文章主要介绍了asp.net(C#)实现功能强大的时间日期处理类,封装了针对日期与时间的各 ...
- oracle sequence 异常
对于数据量较大的序列进行分析 ,出现风险有两种情况1. 序列号随着业务增加变大时,DB的字段空间不足.>>产生后果:插入报错.>>解决方案:给存储序列号的字段进行扩容,且字段长 ...