哈希 构造最大回文数组

题意:

在给出的n个数中选择一部分数,问能组成的最长回文数组长度是多少。

题解:

取出每一个数出现次数的偶数部分作为回文串两边元素相加,最后加上可能存在的出现一次的中间位置即可。

#include<bits/stdc++.h>
using namespace std;
map<int,int> s;
int n;

int main(){
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    int x;
    scanf("%d",&x);
    ++s[x];
  }
  bool odd=false;
  int ans=0;
  for(auto x:s){
    if(x.second&1){
      odd=true;
    }
    //这里代表将偶数部分乘二,为整数乘法是向下取整的
    ans+=(x.second/2)*2;
  }
  ans+=odd;
  printf("%d",ans);
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值