洛谷P3269 [JLOI2016] 字符串覆盖

题目描述

字符串A有N个子串B1,B2,...,Bn。如果将这n个子串分别放在恰好一个它在A中出现的位置上(子串之间可以重叠)这样A中的若干字符就被这N个子串覆盖了。问A中能被覆盖字符个数的最小值和最大值。

输入格式

第一行包含一个正整数T,表示数据组数。保证T<=10。

接下来依次描述T组数据,每组数据中:

第一行包含一个由小写字母组成的字符串,表示母串A。

第二行包含一个整数N,表示子串的个数。

接下来N行,每行包含一个由小写字母组成的字符串,描述子串。数据保证所有子串均在母串中出现。

输出格式

输出为T行,对应每组数据的答案。每行包含两个整数Minans和Maxans,分别表示对应数据中能被覆盖字符数量的最小值和最大值。

输入输出样例

输入 #1

2
hello
4
he
l
l
o
abacaba
4
ab
ba
a
c

输出 #1

4 5 
4 6

说明/提示

字符串长度A<=10000,N<=4,子串长度<=10000

code:

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read()
{rg T data=0;rg int w=1;rg char ch=getchar();while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}while(isdigit(ch)){data=data*10+ch-'0';ch=getchar();}return data*w;
}
template<class T>il T read(rg T&x)
{return x=read<T>();
}
typedef long long ll;
using namespace std;co int N=1e4+1;
char s[N],t[5][N];
int n,m,len[5],cnt[5];
int fail[N];
struct data
{int l,r,id;bool operator<(co data&x)co{return l<x.l;}
}b[5][N],c[4*N];namespace MAX
{bool flag[5];int ans;void dfs(int num,int pl,int pr,int sum){if(num==m){ans=std::max(ans,sum);return;}for(int i=1;i<=m;++i)if(!flag[i]){int u=0,v=0;for(int j=1;j<=cnt[i];++j)if(b[i][j].l>=pl){if(b[i][j].l<=pr) u=j;else {v=j;break;}}flag[i]=1;if(u)dfs(num+1,b[i][u].l,std::max(pr,b[i][u].r),sum+std::max(b[i][u].r-pr,0));if(v)dfs(num+1,b[i][v].l,std::max(pr,b[i][v].r),sum+b[i][v].r-b[i][v].l+1);flag[i]=0;}}int solve(){
//		cerr<<"solve max"<<endl;ans=0;dfs(0,0,0,0);return ans;}
}namespace MIN
{int min[N*4][1<<4],f[N*4][1<<4],tree[N<<4][1<<4];void rebuild(){bool flag[5]={0};for(int i=1;i<=m;++i)for(int j=1;j<=m;++j)if(i!=j&&len[i]<len[j]||len[i]==len[j]&&i>j)for(int k=1;k<=cnt[i];++k)if(b[i][k].l>=b[j][1].l&&b[i][k].r<=b[j][1].r) {flag[i]=1;break;}n=0;int m2=0;for(int i=1;i<=m;++i)if(!flag[i]){for(int j=1;j<=cnt[i];++j)c[++n]=b[i][j],c[n].id=m2;++m2;}m=m2;sort(c+1,c+n+1);}void insert(int x,int s,int l,int r,int p,int v){tree[x][s]=std::min(tree[x][s],v);if(l==r)return;int m=(l+r)/2;if(p<=m)insert(x<<1,s,l,m,p,v);elseinsert(x<<1|1,s,m+1,r,p,v);}int query(int x,int s,int l,int r,int ql,int qr){if(ql>qr)return N;if(ql<=l&&r<=qr)return tree[x][s];int m=(l+r)/2;if(qr<=m)return query(x<<1,s,l,m,ql,qr);if(ql>=m+1)return query(x<<1|1,s,m+1,r,ql,qr);return std::min(query(x<<1,s,l,m,ql,qr),query(x<<1|1,s,m+1,r,ql,qr));}int solve(){
//		cerr<<"solve min"<<endl;rebuild();memset(f,0x3f,sizeof f);f[0][0]=0;memset(min,0x3f,sizeof min);min[0][0]=0;memset(tree,0x3f,sizeof tree);int p=0;for(int i=1;i<=n;++i){while(c[p+1].r<c[i].l) ++p;for(int j=0;j<(1<<m);++j)if(j&(1<<c[i].id))f[i][j]=std::min(min[p][j^(1<<c[i].id)]+c[i].r-c[i].l+1,query(1,j^(1<<c[i].id),1,n,p+1,i-1)+c[i].r);for(int j=0;j<(1<<m);++j){min[i][j]=std::min(min[i-1][j],f[i][j]);insert(1,j,1,n,i,f[i][j]-c[i].r);}}return min[n][(1<<m)-1];}
}int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);int kase;read(kase);while(kase--){scanf("%s",s+1);n=strlen(s+1);read(m);for(int i=1;i<=m;++i){scanf("%s",t[i]+1);len[i]=strlen(t[i]+1),cnt[i]=0;for(int j=1;j<len[i];++j){int k=fail[j];while(k&&t[i][k+1]!=t[i][j+1])k=fail[k];fail[j+1]=t[i][k+1]==t[i][j+1]?k+1:0;}int j=0;for(int k=1;k<=n;++k){while(j&&t[i][j+1]!=s[k])j=fail[j];if(t[i][j+1]==s[k])++j;if(j==len[i])++cnt[i],b[i][cnt[i]].l=k-len[i]+1,b[i][cnt[i]].r=k;}sort(b[i]+1,b[i]+cnt[i]+1);
//			for(int j=1;j<=cnt[i];++j)
//				cerr<<j<<" l="<<b[i][j].l<<" r="<<b[i][j].r<<endl;}printf("%d %d\n",MIN::solve(),MAX::solve());}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Selenium入门之环境搭建

搭建 Selenium 环境主要包括以下几个步骤&#xff1a; 安装 Python 和相关包安装 WebDriver编写和运行 Selenium 脚本 1. 安装 Python 和相关包 首先确保你已经安装了 Python。如果没有安装&#xff0c;可以从 Python 官方网站下载并安装。 然后&#xff0c;使用 pip 安装 …

2024年大数据、区块链与物联网国际会议(ICBDBLT 2024)

2024 International Conference on Big Data, Blockchain, and Internet of Things 【1】大会信息 会议简称&#xff1a;ICBDBLT 2024 大会地点&#xff1a;中国青岛 审稿通知&#xff1a;投稿后2-3日内通知 会议官网&#xff1a;www.icbdblt.com 【2】会议简介 即将召开的…

DDoS攻击:企业与个人都应了解的基本知识

DDoS攻击&#xff0c;全称分布式拒绝服务攻击&#xff08;Distributed Denial of Service attack&#xff09;&#xff0c;是一种常见的网络安全攻击方式。以下是对DDoS攻击的详细解释: DDoS攻击是指攻击者利用大量被控制的计算机或设备&#xff08;通常称为“僵尸网络”或“傀…

签到的二维码怎么制作?快速实现制作二维码签到的方法

现在很多活动会采用二维码的方式来做登记、报名、签到等&#xff0c;通过二维码可以快速获取用户信息&#xff0c;并且对于用户填写内容也提升了便利性&#xff0c;而且还能够节约成本&#xff0c;通过后台就可以查看用户登记的数据&#xff0c;方便后期的分析和信息管理。 想…

四、Nginx配置文件-负载均衡

目录 一、负载均衡的作用 二、负载均衡状态 三、负载均衡的指令 1、upstream 指令 2、server指令 四、负载均衡几种方式 1、轮询&#xff08;Round Robin 常用&#xff09; 2、IP Hash &#xff08;较少&#xff09; 3、最少连接数&#xff08;Least Connections 较少&…

Java Swing库学习

Java Swing 是一个用于创建图形用户界面&#xff08;GUI&#xff09;的库。它是Java基础类库的一部分&#xff0c;提供了丰富的组件和布局管理器&#xff0c;能够帮助开发者创建功能强大、跨平台的桌面应用程序。 学习Swing库的步骤 1. 环境配置 确保你已经安装了JDK&#x…

策略模式(设计模式)

使用策略模式重构 if/else 策略设计模式是一种允许在运行时选择算法的行为。这种模式 ● 定义了一系列算法 ● 封装每种算法 ● 使算法在该系列内可互换。 下面是策略设计模式的架构&#xff0c;客户端将在其中与上下文进行通信。上下文将包含对策略对象的引用&#xff0c;这反…

空白服务器安装系统

一、准备工作 确定服务器的硬件配置&#xff0c;包括处理器、内存、硬盘等信息。选择合适的操作系统镜像文件&#xff0c;可以从官方网站或者第三方网站下载。 二、制作启动盘或镜像 如果服务器支持从光盘启动&#xff0c;可以使用光盘制作软件&#xff08;如UltraISO&#…

考研计组chap3存储系统

目录 一、存储器的基本概念 80 1.按照层次结构 2.按照各种分类 &#xff08;41&#xff09;存储介质 &#xff08;2&#xff09;存取方式 &#xff08;3&#xff09;内存是否可更改 &#xff08;4&#xff09;信息的可保存性 &#xff08;5&#xff09;读出之后data是否…

SwaggerSpy:一款针对SwaggerHub的自动化OSINT安全工具

关于SwaggerSpy SwaggerSpy是一款针对SwaggerHub的自动化公开资源情报&#xff08;OSINT&#xff09;安全工具&#xff0c;该工具专为网络安全研究人员设计&#xff0c;旨在简化广大红队研究人员从SwaggerHub上收集已归档API信息的过程&#xff0c;而这些OSINT信息可以为安全人…

【全网瞩目】最强文生图模型,Stable Diffusion 3技术报告解禁

12号&#xff0c;终于在Hugging Face上出现了 Stable Diffusion 3 Medium。没错&#xff0c;正如他所承诺的&#xff0c;最强文生图模型真的开源了。而且此次开源不仅是以SD2的比较下性能得到了更好的升级&#xff0c;同时也向我们展示了最前沿的DiT技术——MMDiT。 是什么让 S…

【乐吾乐2D可视化组态编辑器】导出HTML,下载离线部署包

乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 使用步骤 1. 从“文件”菜单导出HTML 导出为 HTML 需要一定的开发能力&#xff0c;后续不再维护&#xff0c;即将下线&#xff0c;推荐使用 下载离线部署包&#xff08;html&#xff09; 2. 解压 3. 下载后端…

shell脚本的for循环

循环&#xff1a; 循环是一种重复执行代码的结构。只要满足循环的条件&#xff0c;会一直执行这个代码。 循环条件&#xff1a;在一定范围之内&#xff0c;按照指定的次数来执行循环。 循环体&#xff1a;在指定的次数内&#xff0c;执行的命令序列。只要条件满足&#xff0…

阿里云运维第一步(监控):开箱即用的监控

作者&#xff1a;仲阳 这是云的时代&#xff0c;现在云计算已经在各行各业广泛的应用。但是上云对于大多数客户来说&#xff0c;依然有很大的学习成本&#xff0c;如下图仅是阿里云都有几百款产品&#xff0c;怎么选择&#xff1f;怎么用&#xff1f;对于客户来说都是问题。“…

手撕设计模式——计划生育之单例模式

1.业务需求 ​ 大家好&#xff0c;我是菠菜啊。80、90后还记得计划生育这个国策吗&#xff1f;估计同龄的小伙伴们&#xff0c;小时候常常被”只生一个好“”少生、优生“等宣传标语洗脑&#xff0c;如今国家已经放开并鼓励生育了。话说回来&#xff0c;现实生活中有计划生育&…

2024网络安全学习路线 非常详细 推荐学习

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#…

嵌套查询(二)-谓词EXISTS实现嵌套查询

一、EXISTS谓词 1、作用&#xff1a;用于判断一个子查询的结果是否为空 2、使用语法&#xff1a; 【NOT】EXISTS&#xff08;子查询&#xff09; 语义&#xff1a;如果子查询的查询结果不为空&#xff0c;则EXISTS为真&#xff0c;否则为假 二、举例 1、举例1&#xff1a…

【数据结构 |集合框架、泛型】初始集合框架、时间(空间)复杂度、简单认识泛型

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

学习AI 机器学习,深度学习需要用到的python库

学习人工智能&#xff08;AI&#xff09;时&#xff0c;Python是最流行的编程语言之一。以下是一些常用的Python库和工具&#xff0c;它们可以帮助你入门并深入学习AI和机器学习&#xff1a; 数据处理和分析库 NumPy: 用于处理大型多维数组和矩阵运算&#xff0c;并提供数学函…

【启明智显彩屏应用】Model3A 7寸触摸彩屏的充电桩应用方案

一、充电桩概述 &#xff08;一&#xff09;充电桩诞生背景 随着社会的进步和人们生活质量的提升&#xff0c;汽车已逐渐融入每个家庭的日常生活中。然而&#xff0c;汽车数量的激增也带来了严重的环境污染问题&#xff0c;特别是尾气排放。为了应对这一挑战&#xff0c;新能源…