[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)的,并不可行. 那要怎么做呢 ...
随机推荐
- Java基础学习笔记九 Java基础语法之this和super
构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...
- (译文)JavaScript基础——JavaScript中的深拷贝
在JavaScript中如何拷贝一个对象? 通过引用调用 function mutate(obj) { obj.a = true; } const obj = {a: false}; mutate(o ...
- 基于Python的Web应用开发实践总结
基于Python的Web应用开发学习总结 项目地址 本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...
- scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250
scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...
- JAVA_SE基础——16.方法
接触过C语言的同学,这小章节很容易接受.Java中的方法是类似与C语言中的函数 功能和调用方法都类似 只不过叫法不一样 因为java是面向对象 c是面向过程 仅仅是叫法不同.. . 看到 ...
- 释义Oracle 11r2中并行执行相关参数
因最近对现场某些服务器进行诊断和调整,用到了这类参数,因此对这类参数做了详尽的查阅和研究,现将该类参数释义如下,以方便同行和自己参考,禁止转载: 1.PARALLEL_ADAPTIVE_MULTI_U ...
- 怎样使用下载的bootstrap模板?
核心文件bootstarp.css和bootstarp.js导入到页面,然后看着官网的代码复制进去用就可以了.网上是有不少教程的.实际上就是加class 属性 ,如:http://www.runoob ...
- MySQL命令(逐步更新ing)
启动mysql 开启: /etc/init.d/mysqld start关闭: /etc/init.d/mysqld stop重启: /etc/init.d/mysqld restart 查看m ...
- JavaScript是如何面向对象的
一.引言 在16年的10月份,在校内双选会找前端实习的时候,hr问了一个问题:JavaScript的面向对象理解吗?我张口就说"JavaScript是基于原型的!".然后就没什么好 ...
- Java-NIO(三):直接缓冲区与非直接缓冲区
直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的 ...