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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 250000, M = 12356630, inf = 2e9;
  4. char T[N+5], A[N+5], B[N+5], C[N+5];
  5. int t[N+5], a[N+5], b[N+5], c[N+5], tt, ta, tb, tc, L, R, ans;
  6. int f[N+5], g[N+5];
  7. vector<int>s[M+5];
  8. void get(char *ch, int *a, int &tot) {
  9. int len = 0; char c;
  10. while ((c = getchar()) != '\n') ch[++len] = c;
  11. for (int i = 1, j; i <= len; i = j+1) {
  12. int sum = 0; j = i;
  13. while (ch[j] >= 'a' && ch[j] <= 'z') sum = sum*26+ch[j]-'a'+1, ++j;
  14. a[++tot] = sum;
  15. }
  16. }
  17. void work() {
  18. get(T, t, tt);
  19. get(A, a, ta);
  20. get(B, b, tb);
  21. get(C, c, tc);
  22. for (int i = 1, loc = 1; i <= tt; i++) {
  23. if (t[i] == a[loc]) ++loc;
  24. else ans++;
  25. if (loc == ta+1) {L = i+1; break; }
  26. }
  27. for (int i = tt, loc = tc; i >= 1; i--) {
  28. if (t[i] == c[loc]) --loc;
  29. else ans++;
  30. if (loc == 0) {R = i-1; break; }
  31. }
  32. int sum = inf;
  33. memset(g, 127/3, sizeof(g));
  34. for (int i = 1; i <= tb; i++) s[b[i]].push_back(i);
  35. for (int i = L; i <= R; i++)
  36. for (int j = s[t[i]].size()-1; j >= 0; j--) {
  37. int x = s[t[i]][j];
  38. if (x == 1) f[x] = i, g[x] = 0;
  39. else if (f[x-1]) f[x] = i, g[x] = g[x-1]+i-f[x-1]-1;
  40. sum = min(sum, g[tb]);
  41. }
  42. printf("%d\n", sum+ans);
  43. }
  44. 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中volatile

    volatile用来修饰变量.Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volat ...

  2. Beta冲刺-用户测试报告

    一.项目概述 1.1项目名称 高校学生征信系统 1.2项目简介 此项目基于SSH框架,力图为学生提供征信服务和信用相关的借款和申请活动.其中以信用统计和管理为主,信用使用为辅,构建出一个集信用收集和使 ...

  3. Linux下进程间通信--共享内存:最快的进程间通信方式

    共享内存: 一.概念: 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间. 进程A可以即时看到进程B ...

  4. 小草手把手教你 LabVIEW 串口仪器控制——VISA 串口配置

    建议大家按我发帖子的顺序来看,方便大家理解.请不要跳跃式的阅读.很多人现在看书,都跳跃式的看,选择性的看,导致有些细节的部分没有掌握到,然后又因为某个细节耽误很多时间.以上只是个人建议,高手可以略过本 ...

  5. nyoj 第几是谁

    第几是谁? 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有"abcdefghijkl"12个字符,将其按字典序排列,如果给出任意一种排列, ...

  6. GitHub 上下载单个文件夹

    写代码的一定经常去github上查看.下载一些源码,有时候会想下载一个项目中的一个文件夹里的内容,但是github上只提供了整个项目的下载,而整个项目里东西太多,压缩的文件太大,github的下载速度 ...

  7. HDFS文件读写操作(基础基础超基础)

    环境 OS: Ubuntu 16.04 64-Bit JDK: 1.7.0_80 64-Bit Hadoop: 2.6.5 原理 <权威指南>有两张图,下次po上来好好聊一下 实测 读操作 ...

  8. GIT入门笔记(7)- 修改文件并向版本库提交

    1.修改文件vi readme.txt git status 发现被修改的文件列表git diff readme.txt 2.git add readme.txt git status  --注意gi ...

  9. LXC学习实践(3)快速体验第一个容器

    1.搭建第一个 LXC 虚拟计算机 #yum install lxc* 2.安装软件包后要检查 Linux 发行版的内核对 LXC 的支持情况,可以使用下面命令 #lxc-checkconfig #l ...

  10. Scala:枚举类型的用法

    枚举定义: /** * 场景类型的划分分类:划分出7类 */ object BuildingCalibrateHeightType extends Enumeration { type Buildin ...