#include<iostream> #include<algorithm> #include<cmath> #include<vector> #include<map> #include<set> using namespace std; typedef pair<double,string> PDS; int main() { map<string,set<string> >b; int n;cin>>n; for(int i=0;i<n;i++) { string name,st;cin>>name>>st; b[name].insert(st); } map<string,double> d; for(auto &xx:b) { double sum=xx.second.size(); for(auto &x:xx.second) d[x]+=1.0/sum; } vector<PDS> p; for(auto &x:d) p.push_back({x.second,x.first}); sort(p.begin(),p.end(),[&](const PDS &A,const PDS &B){ if(fabs(A.first-B.first)<=1e-5) return A.second<B.second; return A.first>B.first; }); for(auto &x:p) cout<<x.second<<endl; return 0; }
时间: 2024-03-14 16:48:47 浏览: 57
C++常用的#include头文件总结
这段代码的作用是读入多个字符串,统计每个字符串出现的次数并计算每个字符串在所有字符串中出现的频率,最后按照频率从高到低输出所有字符串。
具体实现方式是,使用一个map来记录每个人拥有的字符串集合,然后再遍历这个map,对于每个字符串,统计它在所有人的字符串集合中出现的频率,最后将频率和字符串存入一个vector中,按照频率从高到低排序输出即可。
注意,这段代码使用了C++11的一些新特性,如auto、lambda表达式等。如果编译器不支持这些特性,则需要进行相应修改。
阅读全文