题目
TUOJ
https://sim.csp.thusaac.com/contest/33/problem/1
思路参考:202403(第33次)CCF CSP真题202403-1,2讲解_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1PUvxefEJr/
思路
核心思路:这题如果会用STL容器(set/map)很容易拿满
代码
可以让AI总结一下代码逻辑
- 归一化处理 :读取两组单词序列,利用 transform 函数将所有单词转换为小写,以实现忽略大小写的匹配。
- 去重与计数 :
- 使用 map<string, int> mpA 存储第一组单词,确保集合 A 中的单词唯一。
- 使用
map<string, int> mpB存储第二组单词,确保集合 B 中的单词唯一。
- 计算交集 :在处理第二组单词时,利用 mpA.count(s) 检查当前(去重后的)单词是否存在于集合 A 中,统计交集大小 jiaoji。
- 计算并集并输出 :
- 输出交集大小 jiaoji。
- 根据容斥原理,输出并集大小:mpA.size() + mpB.size() - jiaoji。
cpp
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
map<string,int>mpA, mpB;
void solve(){
int n,m; cin>>n>>m;
int jiaoji=0;
for(int i=0;i<n;i++){
string s; cin>>s;
// for(int j=0;j<s.size();j++)
// if(isupper(s[j])) s[j]=tolower(s[j]); //tolower 不会改原来的字符
transform(s.begin(),s.end(),s.begin(),::tolower); //直接字符串转小写 transform(源起始, 源结束, 目标起始, 一元操作函数);
if(mpA[s]) continue;
mpA[s]=1;
}
for(int i=0;i<m;i++){
string s; cin>>s;
transform(s.begin(),s.end(),s.begin(),::tolower);
if(mpB[s]) continue; //避免重复计算交集
mpB[s]=1;
// if(mpA[s]==1) jiaoji++; //交集 //warn:如果键 s 不存在,调用 mpA[s] 会自动在 map 中插入该键,并将值初始化为 0
if(mpA.count(s)==1) jiaoji++;
}
cout<<jiaoji<<endl;
cout<<mpA.size()+mpB.size()-jiaoji<<endl;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
solve();
return 0;
}