【全网首发】2023年NOIP T1词典详解

目录

前言

题目详解

AC代码

结尾 


前言

NOIP的第一题我终于终于过了!

还是很激动的,所以想把自己的思路和想法写下来供大家参考。

题目详解

首先还没看过题的小伙伴,请看题:

一道题拿来还是得先理解题目。而这道题简单来说就是能否通过若干次交换字母后,使得目标单词i的字典序最小。如果可能,输出1,否则输出0。 

因为每个单词里的字母都可以任意交换若干次,其实相当于只要包含这几个字母,怎么排列都行

比如我们对hello这个单词进行若干次交换:

helol

hleol

lheol

lhoel

lhleo

……

知道了这个性质,我们再仔细想想,要想目标单词i的字典序最小,那么其他单词的字典序就要尽可能的大。那我们直接预处理每个字符串的最小字典序和最大字典序,然后依次比较不就OK了吗?但是,仔细想想,时间不允许啊,如果按这种做法只能拿80分。

那是不是就没办法了呢?我们很容易想到的就是利用桶排序。怎么做呢?我们可以把每个单词里26个英文字母出现的次数,放入一个桶里,然后从前往后便利目标单词,从后往前便利对比单词,如果目标单词一但有比对比单词大的字母,直接输出0,break一下。比如下面的栗子:

目标单词:hello   对比单词:world

hello的桶:  0 0 0 0 1 0 0 1 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0

world的桶: 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0

hello从前往后的第一个为真的位置:第5个

wolrd从后往前的第一个为真的位置:第23个

因为5<23,所以可以完成,输出1。

哇塞!这种方法真的很巧妙,但是算一算复杂度,也只能拿90分,呜呜呜。

于是作者绞尽脑汁,想了半天,总算想到了一个AC解法。

因为要想目标单词的字典序尽量的小,那么目标单词中最小的一个字母必定排在最前面

而要想对比单词的字典序尽量的大,那么对比单词中最大的一个字母必定排在最前面。

这样只需比较最前面的两个字母就OK了,两个字母不一样很好比较,难点就在于万一开头两个字母一样那该怎么办呢?
大家不要着急,静下心来仔细想想,因为目标单词是递增排列的,而对比单词是递减排列的。

我们假设第一个字母为X,那么目标单词的第二个字母一定是>=x,而对比单词的第二个字母一定是<=x。那么目标单词一定是大于对比单词的。这时就会有细心的同学问了,那如果一直等于x,不就没法比较了吗?那请你仔细读读题:

如果你还没有读懂,那请再读一遍:
 现在明白了吧,那这题不就轻轻松松了吗? 

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,m,minn[3500],maxn[3500];
char s[3500]; 
int main()
{cin>>n>>m; for(int i=1;i<=n;i++) {scanf("%s",s);minn[i]=maxn[i]=s[0]-'a';for(int j=1;j<m;j++){minn[i]=min(minn[i],s[j]-'a');maxn[i]=max(maxn[i],s[j]-'a');}}for(int i=1;i<=n;i++){bool flag=1;for(int j=1;j<=n;j++){if(i!=j&&maxn[j]<=minn[i]){flag=0;cout<<"0";break;}} if(flag) cout<<"1";}return 0;
} 

结尾 

这篇文章应该不能再详细了吧。哪里还没听懂,欢迎私信。

最后祝大家RP++!

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

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

相关文章

数据结构—小堆的实现

前言&#xff1a;前面我们已经学习了二叉树&#xff0c;今天我们来学习堆&#xff0c;堆也是一个二叉树&#xff0c;堆有大堆有小堆&#xff0c;大堆父节点大于子节点&#xff0c;小堆父节点总小于子节点&#xff0c;我们在学习C语言的时候也有一个堆的概念&#xff0c;那个堆是…

第二十章 解读PASCAL VOC2012与MS COCO数据集(工具)

PASCAL VOC2012数据集 Pascal VOC2012官网地址&#xff1a;http://host.robots.ox.ac.uk/pascal/VOC/voc2012/ 官方发表关于介绍数据集的文章 《The PASCALVisual Object Classes Challenge: A Retrospective》&#xff1a;http://host.robots.ox.ac.uk/pascal/VOC/pubs/everi…

MATLAB实战 | MEX文件

应用接口是MATLAB与其他语言相互调用各自函数的方法&#xff0c;MEX文件使MATLAB程序中可以调用或链接其他语言编写的函数&#xff0c;而MATLAB引擎使其他语言程序中可以调用MATLAB函数。 01、MEX文件 MEX是MATLAB Executable的缩写&#xff0c;是MATLAB中用于调用其他语言编写…

设计模式——行为型模式(二)

6.8 迭代器模式 6.8.1 概述 定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 6.8.2 结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggreg…

Bug小能手系列(python)_13: RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might

Python运行代码报错 0 引言1 报错原因2 解决思路3. 总结 0 引言 在运行 Python 代码时出现报错&#xff1a; RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below …

C/C++ 常用加密与解密算法

计算机安全和数据隐私是现代应用程序设计中至关重要的方面。为了确保数据的机密性和完整性&#xff0c;常常需要使用加密和解密算法。C是一种广泛使用的编程语言&#xff0c;提供了许多加密和解密算法的实现。本文将介绍一些在C中常用的加密与解密算法&#xff0c;这其中包括Xo…

Kafka-TopicPartition

Kafka主题与分区 主题与分区 topic & partition&#xff0c;是Kafka两个核心的概念&#xff0c;也是Kafka的基本组织单元。 主题作为消息的归类&#xff0c;可以再细分为一个或多个分区&#xff0c;分区也可以看作对消息的二次归类。 分区的划分为kafka提供了可伸缩性、水…

【Web】Ctfshow Thinkphp3.2.3代码审计(1)

目录 ①web569 ②web570 ③web571 ④web572 ①web569 基础考察 /index.php/Admin/Login/ctfshowLogin ②web570 提示找路由 查看附件源码 (config.php) 发现定义了一个可执行命令的路由规则 /index.php/ctfshow/assert/eval($_POST[1]) 1system(tac /f*); ③web571 提…

设备树是什么?

设备树&#xff1a; 设备树DTS(Device Tree Source) 描述设备信息的独立的文件。 为什么要引入设备树&#xff1f; 随着芯片的发展&#xff0c;Linux内核中就包含着越来越多这些描述设备的代码&#xff0c;导致Linux内核代码会很臃肿。因此引入了设备树文件&#xff0c;从…

手摸手Element-Plus组件化开发

前端环境准备 编码工具: VSCode 依赖管理:NPM 项目构建: Vuecli NPM的全称是Node Package Manager&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。2020年3月17日&#xff0c;Github宣布收购npm&am…

大数据项目--学习笔记

新零售项目介绍 1&#xff0c;行业背景介绍 一&#xff0c;百货商店 百货商店是世界商业史上第一个实行新销售方法的现代大量销售组织。其新型销售方法有&#xff1a; 1&#xff0e;顾客可以毫无顾忌地、自由自在地进出商店&#xff1b; 2&#xff0e;商品销售实行“明码标价…

【brpc学习实践八】bvar及其应用

什么是bvar bvar是多线程环境下的计数器类库&#xff0c;支持单维度bvar和多维度mbvar&#xff0c;方便记录和查看用户程序中的各类数值&#xff0c;它利用了thread local存储减少了cache bouncing&#xff0c;相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销&a…