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]丽洁体的更多相关文章

  1. [BZOJ3214][ZJOI2013]丽洁体(Hash+DP)

    3214: [Zjoi2013]丽洁体 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 906  Solved: 335[Submit][Status] ...

  2. [luogu] P3333 [ZJOI2013]丽洁体(贪心)

    P3333 [ZJOI2013]丽洁体 题目描述 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在 ...

  3. [ZJOI2013]丽洁体

    题目描述 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做这种题,因为较其 ...

  4. bzoj 3214: [Zjoi2013]丽洁体

    Description 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿 写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做 ...

  5. BZOJ3214 [Zjoi2013]丽洁体

    题意 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做这种题,因为较其它题 ...

  6. 【BZOJ】3214: [Zjoi2013]丽洁体

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3214 字符串长度最大不超过$5$直接$HASH$起来 首先在$T$中考虑找到最前的一个包含 ...

  7. 并不对劲的bzoj3214:p3333:[ZJOI2013]丽洁体

    题目大意 有三个由若干个单词组成的字符串\(T,A,B,C(|T|,|A|,|B|,|C|\leq 5*10^4,单词长度\leq5,每个单词出现次数\leq500)\) 求从\(T\)中至少删去多少 ...

  8. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

  9. 数据结构(树套树):ZJOI 2013 K大数查询

    有几个点卡常数…… 发现若第一维为位置,第二维为大小,那么修改时第一维修改区间,查询时第一维查询区间,必须挂标记.而这种情况下标记很抽象,而且Push_down不是O(1)的,并不可行. 那要怎么做呢 ...

随机推荐

  1. Java基础学习笔记九 Java基础语法之this和super

    构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...

  2. (译文)JavaScript基础——JavaScript中的深拷贝

    在JavaScript中如何拷贝一个对象? 通过引用调用 function mutate(obj) { obj.a = true; } const obj = {a: false}; mutate(o ...

  3. 基于Python的Web应用开发实践总结

    基于Python的Web应用开发学习总结 项目地址   本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...

  4. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  5. JAVA_SE基础——16.方法

    接触过C语言的同学,这小章节很容易接受.Java中的方法是类似与C语言中的函数  功能和调用方法都类似  只不过叫法不一样  因为java是面向对象  c是面向过程    仅仅是叫法不同.. . 看到 ...

  6. 释义Oracle 11r2中并行执行相关参数

    因最近对现场某些服务器进行诊断和调整,用到了这类参数,因此对这类参数做了详尽的查阅和研究,现将该类参数释义如下,以方便同行和自己参考,禁止转载: 1.PARALLEL_ADAPTIVE_MULTI_U ...

  7. 怎样使用下载的bootstrap模板?

    核心文件bootstarp.css和bootstarp.js导入到页面,然后看着官网的代码复制进去用就可以了.网上是有不少教程的.实际上就是加class 属性 ,如:http://www.runoob ...

  8. MySQL命令(逐步更新ing)

     启动mysql 开启: /etc/init.d/mysqld start关闭: /etc/init.d/mysqld stop重启: /etc/init.d/mysqld restart   查看m ...

  9. JavaScript是如何面向对象的

    一.引言 在16年的10月份,在校内双选会找前端实习的时候,hr问了一个问题:JavaScript的面向对象理解吗?我张口就说"JavaScript是基于原型的!".然后就没什么好 ...

  10. Java-NIO(三):直接缓冲区与非直接缓冲区

    直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的 ...