第33次CCF计算机软件能力认证【T1~T3】:词频统计、相似度计算、化学方程式配平

news2024/10/6 0:59:16
题目概括
词频统计枚举
相似度计算STL工具(tranform()转换大小写)+ 模拟
化学方程式配平大模拟+高斯消元

1、词频统计

在学习了文本处理后,小 P 对英语书中的 n 篇文章进行了初步整理。

具体来说,小 P 将所有的英文单词都转化为了整数编号。

假设这 n 篇文章中共出现了 m 个不同的单词,则把它们从 1 到 m 进行编号。

这样,每篇文章就简化为了一个整数序列,其中每个数都在 1 到 m 范围内。

现给出小 P 处理后的 n 篇文章,对于每个单词 i (1≤i≤m ),试统计:

单词 i 出现在了多少篇文章中? 单词 i 在全部文章中总共出现了几次? 输入格式 输入共 n+1 行。

输入的第一行包含两个正整数 n 和 m ,分别表示文章篇数和单词编号上限。

输入的第 i+1 行包含由空格分隔的若干整数,其中第一个整数 li 表示第 i 篇文章的长度(单词个数);接下来 li
个整数表示对应的整数序列,序列中每个整数均在 1 到 m 范围内,各对应原文中的一个单词。

输出格式 输出共 m 行。

第 i 行输出由空格分隔的两个整数 xi 和 yi ,表示共有 xi 篇文章包含单词 i ,总计出现次数为 yi 。

数据范围 全部的测试数据满足 0<n,m≤100 ,且每篇文章至少包含一个单词、最多不超过 100 个单词(1≤li≤100 )。

输入样例:
4 3
5 1 2 3 2 1
1 1
3 2 2 2
2 3 2
输出样例:
2 3
3 6
2 2
样例解释 单词 2 在:
文章 1 中出现两次;
文章 3 中出现三次;
文章 4 中出现一次。
因此 x2=3,y2=6 。

思路:

较为简单,按照步骤对题目进行枚举即可

代码:

#include<bits/stdc++.h>

using namespace std;

int n,m; 

const int N= 103; 

//统计所有文章总共包含几个i,并且包含i的文章的个数 

int a[N][N];
int lth[N];//记录长度数组 
int ma[N];
int cnt,mark;

int main()
{
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;i++)
	{
		cin>>lth[i];
		for(int j=1;j<=lth[i];j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	
	//开始统计个数,从单词编号入手 
	for(int i=1;i<=m;i++)
	{
		cnt=0;
		bool flag=false;
		mark=0;
		for(int j=1;j<=n;j++)//枚举每一个数组 
		{
			for(int k=1;k<=lth[j];k++)//枚举到每一个序列的最后一个 
			{
				if(a[j][k]==i)
				{
				    cnt++;
    				flag=true;
				}

			}
			if(flag)
			{
				mark++;//记录出现此数的文章的篇数
				flag=false;
			}	 
		}
		cout<<mark<<" "<<cnt<<endl;
	} 

	return 0;
} 

2、相似度计算

两个集合的 Jaccard 相似度定义为:

Sim(A,B)=|A∩B|/|A∪B| 即交集的大小除以并集的大小。

当集合 A 和 B 完全相同时,Sim(A,B)=1 取得最大值;当二者交集为空时,Sim(A,B)=0 取得最小值。

除了进行简单的词频统计,小 P 还希望使用 Jaccard 相似度来评估两篇文章的相似性。

具体来说,每篇文章均由若干个英文单词组成,且英文单词仅包含“大小写英文字母”。

对于给定的两篇文章,小 P 首先需要提取出两者的单词集合 A 和 B ,即去掉各自重复的单词。

然后计算出:

|A∩B| ,即有多少个不同的单词同时出现在两篇文章中; |A∪B| ,即两篇文章一共包含了多少个不同的单词。
最后再将两者相除即可算出相似度。

需要注意,在整个计算过程中应当忽略英文字母大小写的区别,比如 the、The 和 THE 三者都应被视作同一个单词。

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

输入格式 输入共三行。

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

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

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

输出格式 输出共两行。

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

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

数据范围 全部的测试数据满足:1≤n,m≤104 且每个单词最多包含 10 个字母。

输入样例1: 3 2 The tHe thE the THE 输出样例1: 1 1 样例1解释 A=B=A∩B=A∪B= {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}|A|=8 B= {bles, fouler, les, lherbe,
menue, par, picote}|B|=7 A∩B= {les, par}|A∩B|=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

思路:

由于不区分大小写,所以把所有的字母都统一转化为大写进行处理(用到transform函数来处理字符串

		string x;
		cin>>x;
		transform(x.begin(),x.end(),x.begin(),::toupper);

用set进行去重,这样就可以简单的处理数据

代码:

#include<bits/stdc++.h>

using namespace std;

int n,m; 

const int N=1e4;

unordered_set<string>s1,s2;

int main()
{
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;i++)
	{
		string x;
		cin>>x;
		transform(x.begin(),x.end(),x.begin(),::toupper);

		s1.insert(x);
	}
	int cnt=0;
	for(int i=1;i<=m;i++)
	{
		string x;
		cin>>x;
		transform(x.begin(),x.end(),x.begin(),::toupper);

		s2.insert(x);
	}
	
	for(auto t:s1)
	{
		if(s2.find(t)!=s2.end())
		{
			cnt++;
		}
	}
	
	int total=s1.size()+s2.size();
	cout<<cnt<<endl<<total-cnt;
	return 0;
}

3、化学方程式配平

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c7958f2fbeae49c8911a5ab674dfed9c.jpe

思路:

很显然是一个高斯消元(题目也进行了提示),但在这之前要妥善处理好数据,以便于正确、方便的运用
对数据的处理,转化为矩阵的函数:

void getElement(string str, int &index, int in)
{
    str = str + '#';
    string ele = "";
    int num = 0;
    bool complete = false;
    for (int i = 0; i < str.size(); i++)
    {
        char c = str[i];
        if (c >= '0' && c <= '9')
        {
            complete = true;
            num = num * 10 + c - '0';
        }
        else
        {
            if (complete)
            {
                if (elei.find(ele) != elei.end())
                {
                    mat[elei[ele]][in] = num;
                }
                else
                {
                    elei[ele] = index++;
                    mat[elei[ele]][in] = num;
                }
                ele = c;
                num = 0;
                complete = false;
            }
            else
            {
                ele = ele + c;
            }
        }
    }
}

代码:

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

const int N = 42;
double mat[N][N];
int n, m;
map<string, int> elei;
int index;

double eps = 1e-6;

void initMat()
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            mat[i][j] = 0;
}

void getElement(string str, int &index, int in)
{
    str = str + '#';
    string ele = "";
    int num = 0;
    bool complete = false;
    for (int i = 0; i < str.size(); i++)
    {
        char c = str[i];
        if (c >= '0' && c <= '9')
        {
            complete = true;
            num = num * 10 + c - '0';
        }
        else
        {
            if (complete)
            {
                if (elei.find(ele) != elei.end())
                {
                    mat[elei[ele]][in] = num;
                }
                else
                {
                    elei[ele] = index++;
                    mat[elei[ele]][in] = num;
                }
                ele = c;
                num = 0;
                complete = false;
            }
            else
            {
                ele = ele + c;
            }
        }
    }
}

void _swap(int a, int b)
{
    double tmp;
    for (int i = 0; i < m; i++)
    {
        tmp = mat[a][i];
        mat[a][i] = mat[b][i];
        mat[b][i] = tmp;
    }
}

void _sub(int a, int b)
{
    double magni = mat[a][b] / mat[b][b];
    for (int i = b; i < m; i++)
    {
        mat[a][i] -= mat[b][i] * magni;
    }
}
int main()
{
    cin >> n;
    while (n--)
    {
        cin >> m;
        string str;
        initMat();
        elei.clear();
        index = 0;

        for (int i = 0; i < m; i++)
        {
            cin >> str;
            getElement(str, index, i);
        }
        for (int i = 0; i < m; i++)
        {
            int j;
            for (j = i; j < index; j++)
                if (fabs(mat[j][i]) >= eps)
                    break;

            if (j == index)
                continue;
            else if (j != i)
            {
                _swap(i, j); // swap i j
            }

            for (j = i + 1; j < index; j++)
            {
                if (fabs(mat[j][i]) >= eps)
                {
                    _sub(j, i); // j line sub i
                }
            }
        }
        int k;
        for (k = 0; k < index && k < m; k++)
            if (fabs(mat[k][k]) <= eps)
                break;
        if (k < m)
            cout << "Y" << endl;
        else
            cout << "N" << endl;
    }
    return 0;
}

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

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

相关文章

Linux中的多线程

Linux线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序 列” 进程是系统分配资源的基本实体 线程是CPU调度的基本单位 POSIX线程库 创建线程 功能&#xff1a;创建一个新的线程 原…

执行路径带空格的服务漏洞

原理 当系统管理员配置Windows服务时&#xff0c;必须指定要执行的命令&#xff0c;或者运行可执行文件的路径。 当Windows服务运行时&#xff0c;会发生以下两种情况之一。 1、如果给出了可执行文件&#xff0c;并且引用了完整路径&#xff0c;则系统会按字面解释它并执行 …

算法修炼之路之滑动窗口

目录 一&#xff1a;滑动窗口的认识及模板 二&#xff1a;LeetcodeOJ练习 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 一&#xff1a;滑动窗口的认识及模板 这里先通过一道题来引出滑动窗口 LeetCode 209 长度最小的子数组 画图分析&…

软件验证与确认实验一:静态分析

目录 1. 实验目的及要求.................................................................................................... 3 2. 实验软硬件环境.................................................................................................... 3 …

(C语言贪吃蛇)15.贪吃蛇吃食物

目录 前言 注意事项⚠️ 效果预览 实现方法 运行效果 新的问题&#x1f64b; 最终效果 总结 前言 我们上一节实现了解决了贪吃蛇不合理走位的情况&#xff0c;不理解的再回去看看(传送门&#xff1a;解决贪吃蛇不合理走位)&#xff0c;那么贪吃蛇自然是要吃食物的啊&…

springboot系列--web相关知识探索四

一、前言 web相关知识探索三中研究了请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索三中主要研究了注解方式以及Servlet API方式。本次…

基于springboot vue 电影推荐系统

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

DatePicker 日期控件

效果&#xff1a; 要求&#xff1a;初始显示系统当前时间&#xff0c;点击日期控件后修改文本控件时间。 目录结构&#xff1a; activity_main.xml(布局文件)代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:and…

环境可靠性

一、基础知识 1.1 可靠性定义 可靠性是指产品在规定的条件下、在规定的时间内完成规定的功能的能力。 可靠性的三大要素&#xff1a;耐久性、可维修性、设计可靠性 耐久性&#xff1a;指的是产品能够持续使用而不会故障的特性&#xff0c;或者说是产品的使用寿命。 可维修性&a…

1.MySQL存储过程基础(1/10)

引言 数据库管理系统&#xff08;Database Management System, DBMS&#xff09;是现代信息技术中不可或缺的一部分。它提供了一种系统化的方法来创建、检索、更新和管理数据。DBMS的重要性体现在以下几个方面&#xff1a; 数据组织&#xff1a;DBMS 允许数据以结构化的方式存…

【C++ STL】手撕vector,深入理解vector的底层

vector的模拟实现 前言一.默认成员函数1.1常用的构造函数1.1.1默认构造函数1.1.2 n个 val值的构造函数1.1.3 迭代器区间构造1.1.4 initializer_list 的构造 1.2析构函数1.3拷贝构造函数1.4赋值运算符重载 二.元素的插入,删除,查找操作2.1 operator[]重载函数2.2 push_back函数:…

读论文、学习时 零碎知识点记录01

1.入侵检测技术 2.深度学习、机器学习相关的概念 ❶注意力机制 ❷池化 ❸全连接层 ❹Dropout层 ❺全局平均池化 3.神经网络中常见的层

51c视觉~CV~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/11668984 一、 CV确定对象的方向 介绍如何使用OpenCV确定对象的方向(即旋转角度&#xff0c;以度为单位)。 先决条件 安装Python3.7或者更高版本。可以参考下文链接&#xff1a; https://automaticaddison.com/how-to-s…

【2024年最新】基于springboot+vue的毕业生信息招聘平台lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

基于keras的停车场车位识别

1. 项目简介 该项目旨在利用深度学习模型与计算机视觉技术&#xff0c;对停车场中的车位进行检测和状态分类&#xff0c;从而实现智能停车管理系统的功能。随着城市化的发展&#xff0c;停车场管理面临着车位检测效率低、停车资源分配不均等问题&#xff0c;而传统的人工检测方…

【Python】Dejavu:Python 音频指纹识别库详解

Dejavu 是一个基于 Python 实现的开源音频指纹识别库&#xff0c;主要用于音频文件的识别和匹配。它通过生成音频文件的唯一“指纹”并将其存储在数据库中&#xff0c;来实现音频的快速匹配。Dejavu 的主要应用场景包括识别音乐、歌曲匹配、版权管理等。 ⭕️宇宙起点 &#x1…

【AI知识点】泊松分布(Poisson Distribution)

泊松分布&#xff08;Poisson Distribution&#xff09; 是统计学和概率论中的一种离散概率分布&#xff0c;通常用于描述在固定时间或空间内&#xff0c;某个事件发生的次数。该分布适用于稀有事件的建模&#xff0c;特别是当事件发生是独立的、随机的&#xff0c;且发生的平均…

[Go语言快速上手]初识Go语言

目录 一、什么是Go语言 二、第一段Go程序 1、Go语言结构 注意 2、Go基础语法 关键字 运算符优先级 三、Go语言数据类型 示例 小结 一、什么是Go语言 Go语言&#xff0c;通常被称为Golang&#xff0c;是一种静态类型、编译型的计算机编程语言。它由Google的Robert Gr…

关闭IDM自动更新

关闭IDM自动更新 1 打开注册表2 找到IDM注册表路径 1 打开注册表 winR regedit 2 找到IDM注册表路径 计算机\HKEY_CURRENT_USER\Software\DownloadManager 双击LstCheck&#xff0c;把数值数据改为0 完成 感谢阅读

存储电话号码的数据类型,用 int 还是用 string?

在 Java 编程中&#xff0c;存储电话号码的选择可以通过两种常见方式进行&#xff1a;使用 int 类型或 String 类型。这种选择看似简单&#xff0c;但实际上涉及到 JVM 内部的字节码实现、内存优化、数据表示、以及潜在的可扩展性问题。 Java 基本数据类型与引用数据类型的差异…