NOIP2023模拟19联测40 诡异键盘

题目大意

有一个键盘,上面有 n + 1 n+1 n+1个按键,按下按键 1 ≤ i ≤ n 1\leq i\leq n 1in会打印出字符串 S i S_i Si,按下按键 n + 1 n+1 n+1会删掉结尾的 K K K个字符,如果不足 K K K个字符则全部删完,问打印出 S S S最少要按多少次。

T T T组数据。

1 ≤ T ≤ 100 , 10 ≤ n ≤ 5 × 1 0 3 , 1 ≤ ∑ K ≤ 2 × 1 0 3 1\leq T\leq 100,10\leq n\leq 5\times 10^3,1\leq \sum K\leq 2\times 10^3 1T100,10n5×103,1K2×103

1 ≤ ∑ ( ∑ ∣ S i ∣ ) ≤ 1 0 6 , 1 ≤ ∑ ∣ S ∣ ≤ 5 × 1 0 3 1\leq \sum(\sum|S_i|)\leq 10^6,1\leq \sum |S|\leq 5\times 10^3 1(Si)106,1S5×103

时间限制 2000 m s 2000ms 2000ms,空间限制 512 M B 512MB 512MB


题解

考虑 D P DP DP,设 f i f_i fi表示打出前 i i i个字符需要的最小操作次数。那我们要求的就是打出 S S S的第 i i i个字符到第 j j j个字符需要的最小操作次数。

先考虑如何得到 S S S [ i , j ] [i,j] [i,j]这一段。我们选择一个前 j − i + 1 j-i+1 ji+1个字符与 S S S [ i , j ] [i,j] [i,j]中的字符相同的 S p S_p Sp,然后将 S p S_p Sp打出并删到只剩下 S S S [ i , j ] [i,j] [i,j]这部分即可。我们可以建一棵字典树,每次加入一个 S i S_i Si时更新从根节点到达路径上每个点的最小操作次数。为了求这里的最小操作次数,我们还需要求出删除若干个字符所需要的最小操作次数,这个可以用一个类似“同余”的最短路来求出,用 dijkstra \text{dijkstra} dijkstra可以 O ( K 2 ) O(K^2) O(K2)解决(连边是 O ( k 2 ) O(k^2) O(k2)的,求最短路是 O ( K log ⁡ K ) O(K\log K) O(KlogK)的)。

得到了带到每个位置的最小操作次数之后,枚举每个 i i i,然后在字典树上按 S S S i i i往后枚举,设枚举到 j j j,则用 f i f_i fi来更新 f j f_j fj D P DP DP的时间复杂度为 O ( ∣ S ∣ 2 ) O(|S|^2) O(S2)

总时间复杂度为 O ( ∑ ( ∑ ∣ S i ∣ + ∣ S ∣ 2 + K 2 ) ) O(\sum(\sum |S_i|+|S|^2+K^2)) O((Si+S2+K2))

可以参考代码帮助理解。

code

#include<bits/stdc++.h>
using namespace std;
const int N=5000,M=1000000,K=2000;
int T,n,k,s1,now,bg[N+5],len[N+5],z[K+5],vs[K+5],cm[K+5];
int tot;
char s[N+5],t[M+5],ss[M+5];
long long dis[K+5],to[M+5],f[N+5];
struct node{int x;long long dis;bool operator<(const node ax)const{return dis>ax.dis;}
};
vector<pair<int,int>>g[K+5];
priority_queue<node>q;
struct trie{int a[26];
}w[M+5];
void pt(){int len=strlen(ss+1);for(int i=1;i<=len;i++){t[++now]=ss[i];}
}
void init(){for(int i=0;i<k;i++){z[i]=1e9;vs[i]=cm[i]=0;g[i].clear();}for(int i=1;i<=n;i++){len[i]=bg[i+1]-bg[i];z[len[i]%k]=min(z[len[i]%k],len[i]);vs[len[i]%k]=1;}for(int i=1;i<=n;i++){if(z[len[i]%k]!=len[i]) continue;if(!vs[len[i]%k]) continue;vs[len[i]%k]=0;for(int j=0;j<k;j++){g[(j+len[i])%k].push_back({j,1+(j+len[i])/k});}}for(int i=0;i<k;i++) dis[i]=1e16;dis[0]=dis[k]=0;q.push((node){0,0});while(!q.empty()){int u=q.top().x;q.pop();if(cm[u]) continue;cm[u]=1;for(auto p:g[u]){int v=p.first,w=p.second;if(dis[u]+w<dis[v]){dis[v]=dis[u]+w;q.push((node){v,dis[v]});}}}
}
void pt(int tw){int q,vq=1;for(int i=1;i<=len[tw];i++){q=t[bg[tw]+i-1]-'a';if(!w[vq].a[q]){w[vq].a[q]=++tot;to[tot]=1e16;}vq=w[vq].a[q];to[vq]=min(to[vq],1ll+(len[tw]-i)/k+dis[(len[tw]-i)%k]);}
}
void solve(int tw){int q,vq=1;for(int i=tw+1;i<=s1;i++){q=s[i]-'a';if(!w[vq].a[q]) return;vq=w[vq].a[q];f[i]=min(f[i],f[tw]+to[vq]);}
}
int main()
{
//	freopen("keyboard.in","r",stdin);
//	freopen("keyboard.out","w",stdout);scanf("%d",&T);while(T--){scanf("%d%d",&n,&k);now=0;for(int i=1;i<=n;i++){scanf("%s",ss+1);bg[i]=now+1;pt();}bg[n+1]=now+1;scanf("%s",s+1);s1=strlen(s+1);init();tot=1;for(int i=1;i<=n;i++) pt(i);for(int i=0;i<=s1;i++) f[i]=1e16;f[0]=0;for(int i=0;i<s1;i++) solve(i);if(f[s1]>=1e16) printf("-1\n");else printf("%lld\n",f[s1]);for(int i=1;i<=tot;i++){for(int j=0;j<26;j++) w[i].a[j]=0;}}return 0;
}

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

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

相关文章

创邻科技亮相ISWC 2023,国际舞台见证知识图谱领域研究突破

近日&#xff0c;第22届国际语义网大会 ISWC 2023 在雅典希腊召开&#xff0c;通过线上线下的形式&#xff0c;聚集了全球的顶级研究人员、从业人员和行业专家&#xff0c;讨论、发展和塑造语义网和知识图谱技术的未来。创邻科技CEO张晨博士作为知识图谱行业专家受邀参会&#…

熟悉 Unity HDRP设置以提高性能

HDRP Version 10 了解如何利用高清晰度渲染管道(HDRP)设置&#xff0c;以最大限度地提高性能&#xff0c;并一次实现强大的图形。 随着Unity 2020 LTS及以后的HDRP版本10的发布&#xff0c;HDRP包继续优先考虑其用户友好的界面&#xff0c;灵活的功能&#xff0c;稳定性和总体…

2023年软件安装管家目录最新

软件目录 ①【电脑办公】电脑系统&#xff08;直接安装&#xff09;Win7Win8Win10OfficeOffice激活office2003office2007office2010office2013office2016office2019office365office2021wps2021Projectproject2007project2010project2016project2019project2013project2021Visio…

机器学习中的独立和同分布 (IID):假设和影响

一、介绍 在机器学习中&#xff0c;独立和同分布 &#xff08;IID&#xff09; 的概念在数据分析、模型训练和评估的各个方面都起着至关重要的作用。IID 假设是确保许多机器学习算法和统计技术的可靠性和有效性的基础。本文探讨了 IID 在机器学习中的重要性、其假设及其对模型开…

Kafka中topic(主题)、broker(代理)、partition(分区)和replication(副本)它们的关系

在Apache Kafka中&#xff0c;有四个重要的概念&#xff1a;topic&#xff08;主题&#xff09;、broker&#xff08;代理&#xff09;、partition&#xff08;分区&#xff09;和replication&#xff08;副本&#xff09;。它们的关系如下&#xff1a; Topic&#xff08;主题&…

leetcode刷题日记:141. Linked List Cycle(环形链表)

这一题是给我们一个链表让我们判断这是否是一个环形链表&#xff0c;我们知道如果一个链表中有环的话这一个链表是没有办法访问到尾的&#xff0c; 假若有如图所示的带环链表&#xff1a; 我们从图示中很容易看出来这一个链表在访问的时候会在里面转圈&#xff0c;我们再来看看…

sklearn 笔记 BallTree/KD Tree

由NearestNeighbors类包装 1 主要使用方法 sklearn.neighbors.BallTree(X, leaf_size40, metricminkowski, **kwargs) X数据集中的点数leaf_size改变 leaf_size 不会影响查询的结果&#xff0c;但可以显著影响查询的速度和构建树所需的内存metric用于距离计算的度量。默认为…

stable diffusion comfyui的api使用教程

一、为什么要使用comfyui的api?对比webui的api&#xff0c;它有什么好处&#xff1f; 1、自带队列 2、支持websocket 3、无需关心插件是否有开放api接口&#xff0c;只要插件在浏览器中可以正常使用&#xff0c;接口就一定可以使用 4、开发人员只需关心绘图流程的搭建 5、切换…

【数据结构】快速排序算法你会写几种?

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

Stable Diffusion 是否使用 GPU?

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D数字孪生场景编辑器 Stable Diffusion 已迅速成为最流行的生成式 AI 工具之一&#xff0c;用于通过文本到图像扩散模型创建图像。但是&#xff0c;它需…

Linux基本指令及周边(第一弹)

文章目录 前言mkdir指令&#xff08;重要&#xff09;&#xff1a;tree指令rmdir指令 && rm 指令(重要&#xff09;&#xff1a;touch指令ls指令pwd指令cd 指令用户家目录man指令&#xff08;重要&#xff09;&#xff1a;mv指令&#xff08;重要&#xff09;cat指令绝…

vue2+elementUI 仿照SPC开发CPK分析工具

源码地址请访问 Vue CPK分析工具页面设计源码&#xff08;支持左右可拖拽和表格可编辑、复制粘贴&#xff09;仿照SPC开发-CSDN博客

序列化、反序列化和反射会破坏单例模式

反射和序列化操作都可能破坏单例模式的实现。 使用反射可以访问类的私有构造函数并强制创建一个新的实例&#xff0c;这将破坏单例模式的唯一性原则&#xff0c;因为它允许创建多个实例。为防止这种情况发生&#xff0c;可以通过在单例类的构造函数中添加防止多次实例化的检查…

Python---列表 集合 字典 推导式(本文以 字典 为主)

推导式&#xff1a; 推导式comprehensions&#xff08;又称解析式&#xff09;&#xff0c;是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列&#xff08;一个有规律的列表或控制一个有规律列表&#xff09;的结构体。 共有三种推导&#xff1a;列表…

TDengine 跨版本迁移实战

TDengine 3.0 已经退出了近一年&#xff0c;目前已经到了 3.2 版本。很遗憾的是 2.x 和 3.x 之间的数据文件不兼容。 如果向从 2.x 升级到 3.x 只能选择数据迁移的方式。 目前数据迁移有三种方法&#xff1a; 使用官方推荐工具 taosx。使用 taosdump 工具。自己写程序。 迁移…

DevOps系列---【jenkinsfile使用sshpass发送到另一台服务器】

1.首先在宿主机安装sshpass 2.把物理机的sshpass复制到容器中 which sshpass cp $(which sshpass) /usr/local/app/ docker cp sshpass 容器id:/usr/local/bin/sshpass 3.在jenkinsfile中添加 #在stages中添加stage stage(部署TEST服务){steps{sh "sshpass -p root1234 sc…

【Azure 架构师学习笔记】-Azure Storage Account(6)- File Layer

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account&#xff08;5&#xff09;- Data Lake layers 前言 上一文介绍了存储帐户的概述&#xff0c;还有container的一些配置&#xff0c;在…

ubuntu云服务器配置SFTP服务

目录 一、安装并运行SSH服务 1&#xff0c;安装ssh服务 2&#xff0c;运行ssh 3&#xff0c;查看ssh运行状态 二、创建SFTP用户并进行用户相关的配置 1&#xff0c;创建SFTP用户 2&#xff0c;限制用户只能使用 SFTP&#xff0c;并禁止 SSH 登录。打开/ect/ssh/sshd_conf…

Android 中字符串空格占位

Android 中字符串空格占位 在布局文件XML中的占位符&#xff08;分号是占位符的一部分&#xff09; 普通的英文半角空格 &#xA0; no-breakspace(普通的英文半角空格但不换行) 中文全角空格(一个中文宽度) &ensp; en空格(半个中文宽度) &emsp; em…

E签宝面试题

文章目录 1.自我介绍2.静态方法和普通方法的区别?3.了解bio/nio/aio吗?4.Spring中创建Bean的方法?4.1 通过Spring XML实现4.2 通过注解实现5.讲讲集合类?6.说说ThreadLocal?7.Redis淘汰策略有哪些?8.说下对JVM的了解?9.详细说下堆区?10.Nacos中有一个服务挂了再调用它会…