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;
}
相关推荐
charlie11451419133 分钟前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
呜喵王阿尔萨斯39 分钟前
编程中的英语
c语言·c++
likeGhee1 小时前
python缓存装饰器实现方案
开发语言·python·缓存
whoarethenext1 小时前
使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
开发语言·c++·faiss
项目題供诗1 小时前
黑马python(二十五)
开发语言·python
慌糖2 小时前
RabbitMQ:消息队列的轻量级王者
开发语言·javascript·ecmascript
醇醛酸醚酮酯2 小时前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
jioulongzi2 小时前
记录一次莫名奇妙的跨域502(badgateway)错误
开发语言·python
向阳@向远方3 小时前
第二章 简单程序设计
开发语言·c++·算法
Mr_Xuhhh3 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构