CCF CSP 第33次(2024.03)(2_相似度计算_C++)(字符串中字母大小写转换+哈希集合)

news2025/3/31 10:22:29

CCF CSP 第33次(2024.03)(2_相似度计算_C++)

    • 题目背景:
    • 题目描述:
    • 输入格式:
    • 输出格式:
    • 样例1输入:
    • 样例1输出:
    • 样例1解释:
    • 样例2输入:
    • 样例2输出:
    • 样例2解释:
    • 样例3输入:
    • 样例3输出:
    • 子任务:
      • 解题思路:
        • 思路一(字符串中字母大小写转换+哈希集合):
      • 代码实现
        • 代码实现(思路一(字符串中字母大小写转换+哈希集合)):

时间限制: 1.0 秒
空间限制: 512 MiB

题目背景:

两个集合的 Jaccard 相似度定义为:
Sim(A,B)= ∣A∪B∣/∣A∩B∣
​即交集的大小除以并集的大小。当集合 𝐴 和 𝐵完全相同时,𝑆𝑖𝑚(𝐴,𝐵)=1取得最大值;当二者交集为空时,𝑆𝑖𝑚(𝐴,𝐵)=0取得最小值。

题目描述:

除了进行简单的词频统计,小 P 还希望使用 Jaccard 相似度来评估两篇文章的相似性。 具体来说,每篇文章均由若干个英文单词组成,且英文单词仅包含“大小写英文字母”。 对于给定的两篇文章,小 P 首先需要提取出两者的单词集合 𝐴和 𝐵,即去掉各自重复的单词。 然后计算出:

∣𝐴∩𝐵∣,即有多少个不同的单词同时出现在两篇文章中;
∣𝐴∪𝐵∣,即两篇文章一共包含了多少个不同的单词。
最后再将两者相除即可算出相似度。 需要注意,在整个计算过程中应当忽略英文字母大小写的区别,比如 the、The 和 THE 三者都应被视作同一个单词。

试编写程序帮助小 P 完成前两步,计算出 ∣𝐴∩𝐵∣ 和 ∣𝐴∪𝐵∣;小 P 将亲自完成最后一步的除法运算。

输入格式:

从标准输入读入数据。

输入共三行。

输入的第一行包含两个正整数 𝑛 和 𝑚,分别表示两篇文章的单词个数。

第二行包含空格分隔的 𝑛 个单词,表示第一篇文章;

第三行包含空格分隔的 𝑚 个单词,表示第二篇文章。

输出格式:

输出到标准输出。

输出共两行。

第一行输出一个整数 ∣𝐴∩𝐵∣,即有多少个不同的单词同时出现在两篇文章中;

第二行输出一个整数 ∣𝐴∪𝐵∣,即两篇文章一共包含了多少个不同的单词。

样例1输入:

3 2
The tHe thE
the THE

样例1输出:

1
1

样例1解释:

𝐴=𝐵=𝐴∩𝐵=𝐴∪𝐵= {the}

样例2输入:

9 7
Par les soirs bleus dete jirai dans les sentiers
PICOTE PAR LES BLES FOULER LHERBE MENUE

样例2输出:

2
13

样例2解释:

𝐴=A= {bleus, dans, dete, jirai, les, par, sentiers, soirs} ∣𝐴∣=8

𝐵=B= {bles, fouler, les, lherbe, menue, par, picote} ∣𝐵∣=7

𝐴∩𝐵=A∩B= {les, par} ∣𝐴∩𝐵∣=2

样例3输入:

15 15
Thou that art now the worlds fresh ornament And only herald to the gaudy spring
Shall I compare thee to a summers day Thou art more lovely and more temperate

样例3输出:

4
24

子任务:

80% 的测试数据满足:𝑛,𝑚≤100且所有字母均为小写;

全部的测试数据满足:𝑛,𝑚≤104 且每个单词最多包含 10 个字母。

解题思路:

思路一(字符串中字母大小写转换+哈希集合):

1、解题步骤拆分:
① 忽略英文字母大小写,我们可以将所有的字母转换为小写。
② 忽略一个集合中重复的单词,我们可以想到哈希集合来进行降重。
③ 求并集,可以想到将两个集合中的并入一个集合。
④ 求交集,可以想到通过查找集合A中的元素是否存在集合B中来求出。

代码实现

代码实现(思路一(字符串中字母大小写转换+哈希集合)):
#include<iostream>  
#include<unordered_set>  // 引入unordered_set容器,使用哈希表来存储不重复元素
#include<algorithm>   // 引入算法库,包含transform、tolower、toupper等函数

using namespace std;

int main(int argc, char const *argv[]) {
    int n, m;
    cin >> n >> m;  // 输入两个整数 n 和 m,分别表示集合A和集合B的元素个数
    
    unordered_set<string> setA, setB;  // 定义两个unordered_set,分别存储集合A和集合B的元素
    string word;  // 用于存储每次输入的单词

    // 读取n个单词并插入集合setA
    for (int i = 0; i < n; i++) {
        cin >> word;
        // 使用transform函数将单词转为小写  //tolower转小写 。toupper转为大写
        transform(word.begin(), word.end(), word.begin(), ::tolower);  // tolower将字母转为小写
        setA.insert(word);  // 将小写形式的单词插入setA
    }

    // 读取m个单词并插入集合setB
    for (int i = 0; i < m; i++) {
        cin >> word;
        // 使用transform函数将单词转为小写
        transform(word.begin(), word.end(), word.begin(), ::tolower);  // tolower将字母转为小写
        setB.insert(word);  // 将小写形式的单词插入setB
    }

    unordered_set<string> intersection, unionSet;  // 定义两个unordered_set,分别存储交集和并集

    // 计算集合B与集合A的交集 (也可以使用一个变量来计数)
    for (auto &str : setB) {  // 遍历集合B中的每个元素
        if (setA.count(str)) {  // 如果setA中包含该元素  //如果使用setA.find()则需与setA.end()进行比较判断有无
            intersection.insert(str);  // 将该元素插入交集
        }
    }

    // 计算集合A与集合B的并集(也可以使用原来的set集合,将setB并入setA)
    unionSet = setA;  // 将setA的所有元素先复制到unionSet中
    for (auto &str : setB) {  // 遍历集合B中的每个元素
        unionSet.insert(str);  // 将集合B中的元素插入unionSet(如果元素已经存在,insert不会重复插入)
    }

    // 输出交集的大小
    cout << intersection.size() << endl;

    // 输出并集的大小
    cout << unionSet.size() << endl;

    return 0;  // 返回0,表示程序成功结束
}
//ch = std::toupper(ch);  // 将字符转换为大写

欢迎大家和我沟通交流(✿◠‿◠)

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

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

相关文章

试试智能体工作流,自动化搞定运维故障排查

APO 1.5.0版本全新推出的智能体工作流功能&#xff0c;让运维经验不再零散&#xff01;只需将日常的运维操作和故障排查经验转化为标准化流程&#xff0c;就能一键复用&#xff0c;效率翻倍&#xff0c;从此告别重复劳动&#xff0c;把时间留给更有价值的创新工作。更贴心的是&…

Linux应用:线程基础

线程介绍 进程是程序在操作系统里的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的一个执行单元&#xff0c;是 CPU 调度和分派的基本单位。一个进程可以包含多个线程&#xff0c;这些线程共享进程的资源&#xff0c;如内存空间、文…

要创建一个基于Spring Boot、Thymeleaf、MyBatis Plus和MySQL的简单表格增删改查(CRUD)项目

文章目录 要创建一个基于Spring Boot、Thymeleaf、MyBatis Plus和MySQL的简单表格增删改查&#xff08;CRUD&#xff09;项目1. 创建Spring Boot项目2.项目配置2.1 依赖yml配置数据库表配置 3.代码实现3.1 实体类3.2 数据访问层3.3 服务层3.4 控制层3.5 Thymeleaf模板 要创建一…

解决Cubemx生产的 .ioc文件不能外部打开的方法

正常来说&#xff0c;cubemx生成的文件会有图标 但是当图标白色的时候&#xff0c;无法通过直接点击这个文件进入cubemx 1.首先检查java环境是不是装的JAVA8&#xff0c;如果是的话进行第二步操作&#xff1b; 2.重新安装一次cubemx&#xff0c;在安装的时候选择为我安装&…

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服务器,并实现远程联机,详细教程

Linux 部署 MineCraft 服务器 详细教程&#xff08;丐版&#xff0c;无需云服务器&#xff09; 一、虚拟机 Ubuntu 部署二、下载 Minecraft 服务端三、安装 JRE 21四、安装 MCS manager 面板五、搭建服务器六、本地测试连接七、下载樱花&#xff0c;实现内网穿透&#xff0c;邀…

Transformer | 一文了解:缩放、批量、多头、掩码、交叉注意力机制(Attention)

源自: AINLPer&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2025-3-27 更多&#xff1a;>>>>专注大模型/AIGC、学术前沿的知识分享&#xff01; 引言 之前的文章&#xff1a;2万字长文&#xff01;一文了解…

原型验证后客户推翻原有需求,如何止损

原型验证后客户推翻原有需求时止损的有效方法包括&#xff1a;迅速评估影响范围、立即开展沟通确认、调整项目计划和资源配置、更新变更管理流程、协商成本分担机制。其中&#xff0c;迅速评估影响范围是关键&#xff0c;项目团队必须立即明确此次变更的具体影响&#xff0c;包…

六、小白学JAVA-类和对象

1、什么是类和对象 人类---类&#xff1a;走路、说话、学习 人---对象&#xff1a;具体到某个人&#xff0c;就是对象&#xff0c;走路、说话、学习&#xff0c;每个人都是独特的人。 public class Person {String name;public void walk() {System.out.println("我会走…

STM32硬件IIC与OLED使用

OLED屏幕介绍 OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点&#xff0c;被认为是下一代的平面显示屏新兴应用技术 OLED显示…

基于Spring Boot的电动车智能充电服务平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

十、JavaScript对象

一、对象 创建对象的方法有三种&#xff1a;字面量、new、构造函数。 1.利用字面量创建对象 花括号{}里面包含了表达这个具体事物&#xff08;对象&#xff09;的属性和方法 // 1.利用对象字面量创建对象{}// var obj {}; // 创建了一个空的对象var obj {uname: black,ag…

FFmpeg开发学习:音视频封装

1.基本流程 1.输入参数 输出文件路径 char *output 视频编码参数 AVCodecParameters *video_par 音频编码参数 AVCodecParameters *audio_par 数据包 AVPacket *packets[] 2.封装流程 &#xff08;1&#xff09;创建输出的上下文AVFormatContext指针 AVFormatContext *out_fm…

hackmyvm-reversteg

arp-scan -l nmap -sS -v 192.168.222.45 在源码中可以看到 根据下面的提示可以猜测117db0148dc179a2c2245c5a30e63ab0是一个图像文件 将图片下载到本地 隐写术 在两张图片上使用strings,发现有一些可打印的字符串 strings 117db0148dc179a2c2245c5a30e63ab0.jpg base64解码…

UE4学习笔记 FPS游戏制作17 让机器人持枪 销毁机器人时也销毁机器人的枪 让机器人射击

添加武器插槽 打开机器人的Idle动画&#xff0c;方便查看武器位置 在动画面板里打开骨骼树&#xff0c;找到右手的武器节点&#xff0c;右键添加一个插槽&#xff0c;重命名为RightWeapon&#xff0c;右键插槽&#xff0c;添加一个预览资产&#xff0c;选择Rifle&#xff0c;根…

设计模式(创建型)-建造者模式

定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。该模式允许通过多个简单的步骤逐步构建出一个复杂的对象&#xff0c;用户只需指定复杂对象…

Git 之配置ssh

1、打开 Git Bash 终端 2、设置用户名 git config --global user.name tom3、生成公钥 ssh-keygen -t rsa4、查看公钥 cat ~/.ssh/id_rsa.pub5、将查看到的公钥添加到不同Git平台 6、验证ssh远程连接git仓库 ssh -T gitgitee.com ssh -T gitcodeup.aliyun.com

黑马点评项目

遇到问题&#xff1a; 登录流程 session->JWT->SpringSession->tokenRedis &#xff08;不需要改进为SpringSession&#xff0c;token更广泛&#xff0c;移动端或者前后端分离都可以用&#xff09; SpringSession配置为redis模式后&#xff0c;redis相当于分布式se…

【AVRCP】AVRCP核心术语解析

目录 一、协议核心术语&#xff1a;架构的基石 1.1 音视频控制协议簇&#xff08;AVRCP 生态链&#xff09; 1.2 数据传输协议&#xff08;L2CAP 核心术语&#xff09; 二、设备架构术语&#xff1a;角色与交互 2.1 设备角色模型&#xff08;CT/TG 二元架构&#xff09; …

【弹性计算】异构计算云服务和 AI 加速器(四):FPGA 虚拟化技术

异构计算云服务和 AI 加速器&#xff08;四&#xff09;&#xff1a;FPGA 虚拟化技术 &#x1f680; FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;是一种可重构的半导体芯片&#xff0c;允许用户根据需要动态配置硬件逻辑&#xff…

编译原理——自底向上语法优先分析

文章目录 自底向上优先分析概述一、自底向上优先分析概述二、简单优先分析法&#xff08;一&#xff09;优先关系定义&#xff08;二&#xff09;简单优先文法的定义&#xff08;三&#xff09;简单优先分析法的操作步骤 三、算法优先分析法&#xff08;一&#xff09;直观算符…