202403-02-相似度计算 csp认证

其实这个问题就是求两篇文章的词汇的交集和并集,首先一说到并集,我就想到了set集合数据结构,set中的元素必须唯一。
STL之set的基本使用--博客参考

  • 所以将两个文章的词汇全部加入set中,并求出set的大小,即为并集的大小。
cpp 复制代码
#include <iostream>
#include <string>
#include <set>

using namespace std;

void toupper(string &str)
{
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] >= 'a' && str[i] <= 'z')
        {
            str[i] = str[i] - ('a' - 'A');
        }
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    
    string word;
    set<string> first_set;  // 存储第一篇文章的单词
    set<string> union_set;  // 存储并集
    
    // 读取第一篇文章
    for(int i = 0; i < n; i++){
        cin >> word;
        toupper(word);
        first_set.insert(word);
        union_set.insert(word);
    } 
    
    int intersection = 0;  // 交集数量
    
    // 读取第二篇文章
    for(int i = 0; i < m; i++){
        cin >> word;
        toupper(word);
        
        // 判断是否在第一篇文章中出现过
        if(first_set.find(word) != first_set.end()){
            intersection++;
            first_set.erase(first_set.find(word)); // 在第一篇文章的set中删除,这样第二篇文章中出现 连续两个the的时候只会统计一次 
        }
        
        // 加入并集
        union_set.insert(word);
    } 
    
    // 输出结果
    cout << "交集数量: " << intersection << endl;
    cout << "并集数量: " << union_set.size() << endl;
    
    system("pause");  // 仅用于调试环境,提交代码时建议移除
    return 0;
}

但是我一开始选用的是unordered_map。。。我也不知道为什么、

cpp 复制代码
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
void toUpperCase(string &str)
{
    for (int i = 0; i < str.size(); i++)
    {
        if (char(str[i]) >= 'a' && char(str[i])  'z')
        {
            str[i] = str[i] - (char('a') - 'A');
        }
    }
}

void PrintMap(const unordered_map<string, int>& rd)
{
	cout << "------------------" << endl;
    for (auto i : word)
    {
        cout << i.first << " " << i.second << dl;
    }
    
}
int main()
{
    int n, m; // 两篇文章的单词个数
    cin >> n >> m;
    string word;
    unordered_map<string, int> nword;
    unordered_map<string, int> mword;
    
    unordered_map<string, int> mixed;
    for (int i = 0; i < n; i++)
    {
        cin >> word;
        toUpperCase(word);
        nword[word] = 1;
        mixed[word]++;
    }
    
    int sum = 0; // 并集数量 
    for (int i = 0; i < m; i++)
    {
        cin >> word;
        toUpperCase(word);
        mixed[word]++;
        if(nword[word] > 0 && mword[word] == 0){ // 如果在第一篇文章已经存在 而且是第二篇文章第一次读取到 
        	sum++;
		}
		mword[word] = 1;
    }
    PrintMap(nword), PrintMap(mword);
    
    PrintMap(mixed);
    cout << sum << endl;
    cout << mixed.size() << endl;
    
    system("pause");
    return 0;
}

//更加节省空间的方法 
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
void toUpperCase(string &str)
{
    for (int i = 0; i < str.size(); i++)
    {
        if (char(str[i]) >= 'a' && char(str[i]) <= 'z')
        {
            str[i] = str[i] - (char('a') - 'A');
        }
    }
}

void PrintMap(const unordered_map<string, int>& word)
{
	cout << "------------------" << endl;
    for (auto i : word)
    {
        cout << i.first << " " << i.second << endl;
    }
    
}
int main()
{
    int n, m; // 两篇文章的单词个数
    cin >> n >> m;
    string word;    
    unordered_map<string, int> mixed;
    for (int i = 0; i < n; i++)
    {
        cin >> word;
        toUpperCase(word);
        mixed[word] = 1; // 表示在两篇文章中第一篇出现 
    }
    
    int sum = 0; // 并集数量 
    for (int i = 0; i < m; i++)
    {
        cin >> word;
        toUpperCase(word);
        if(mixed[word] == 1){
        	sum++;
        	mixed[word] = 2; // 表现在第二篇出现 
		} 
    }
    
    PrintMap(mixed);
    cout << sum << endl;
    cout << mixed.size() << endl;
    
    return 0;
}
相关推荐
Joy-鬼魅1 分钟前
Win10x64系统VS2022使用CreateFileMapping返回无效句柄
c++·createfilemap·vc·getlasterror
冷崖6 分钟前
排序--基数排序
c++·算法
毕设源码-钟学长9 分钟前
【开题答辩全过程】以 基于java的点餐猫在线个性化点餐系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
淼淼76316 分钟前
Qt调度 程序
开发语言·c++·windows·qt
智算菩萨17 分钟前
【实战】使用讯飞星火API和Python构建一套文本摘要UI程序
开发语言·python·ui
A242073493028 分钟前
JavaScript图表制作:从入门到精通
开发语言·javascript·信息可视化
LYFlied29 分钟前
【每日算法】LeetCode124. 二叉树中的最大路径和
数据结构·算法·leetcode·面试·职场和发展
BD_Marathon38 分钟前
Vue3_简介和快速体验
开发语言·javascript·ecmascript
tryxr1 小时前
Java 多线程标志位的使用
java·开发语言·volatile·内存可见性·标志位
暗然而日章1 小时前
C++基础:Stanford CS106L学习笔记 13 特殊成员函数(SMFs)
c++·笔记·学习