DNA 排序题(pair,STL)与pair的复习

https://acm.ecnu.edu.cn/contest/43/problem/1046/

有若干个 DNA,每个 DNA 可能出现一次或者多次。

统计每个 DNA 出现的次数,然后再按照 DNA 出现次数的升序来输出这些 DNA。对于出现次数相同的 DNA,按照字典顺序排列输出(升序)。

输入格式

第一行是一个整数t 。

接下来 t 行,每行一个 DNA。每个 DNA 是由 ACGT 字符组成的,长度不超过 20。

  • 对于 40% 的数据:1≤t≤20;
  • 对于 70% 的数据:1≤t≤2000;
  • 对于所有的数据:1≤t≤200 000。

输出格式

输出经去重和排序后的 DNA,每个 DNA 一行。

样例

input

6
CTGGTGGGGAGATGAG
TTGCCACCAACGACGAT
TTGCCACCAACGACGAT
TATGCAG
TATGCAG
TATGCAG

output

CTGGTGGGGAGATGAG
TTGCCACCAACGACGAT
TATGCAG

来自ecnu鲍钰程设实训,应该是学长出的题,借这道题复习一下pair

思路:
读入DNA字符串,用map存储对应的出现次数,
通过pair提取map中数对,存入vector中转,实现按照map第二关键字的排序

#include<bits/stdc++.h>
using namespace std;

bool cmp(pair<string,int>p1,pair<string,int>p2){
    if((p1.second)==(p2.second))
        return (p1.first)<(p2.first);
    return (p1.second)<(p2.second);
}        //定义pair排序规则

int main(){
    int n;
    cin>>n;
    map<string,int>m;        
    vector<pair<string,int> >v;       //通过动态数组中转进行排序
    while(n--){
        string s;
        cin>>s;
        if(m.find(s)!=m.end())
            m[s]++;
        else m[s]=1;    //存入map,初始化为1
    }
    for(map<string,int>::iterator it=m.begin();it!=m.end();it++){
        pair<string,int>p(it->first,it->second);    //通过pair放入数组内
        v.push_back(p);
    }
    sort(v.begin(),v.end(),cmp);
    for(int i=0;i<v.size();i++){
        cout<<v[i].first<<endl;
    }
    return 0;
}

关于pair:

初始化:
pair<int,double> p(5,1.2);

赋值:
pair<int,double> p,p1;
p.first=5;
p.second=1.2;
p1=p;

函数:
make_pair<a,b> 接受a,b两个变量,返回两个变量组成的pair
swap(p1,p2)  交换两个pair的值

大小比较:
<><=>= 四个运算符  优先比较第一个变量,再比较第二个变量
可以放入优先队列

与map:
map中储存的键值通过pair向外暴露,例如本题利用pair对map排序
map<int,double>m;
m.insert(make_pair(5,1.2));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auroraaaaaaaaaaaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值