【每日一题】Necklace 题解

Necklace

https://ac.nowcoder.com/acm/problem/111227

Description

给一堆字母的使用次数,判断能否构成一个环,使得断环成链后能够成为回文串的节点尽可能多。

Solution

首先思考回文串的定义,显然如果有两个以上奇数存在是不可能构成回文串的。
接着画个图,给出几组数据

3
2 4 2

2
2 2

2
2 3

图片说明
不难看出,按照我们的构造方法,答案最多只能是
如果有一个奇数,就把这个奇数放到中间处
构造方法是每次放 个字母构成一个回文串,拼接到一起

Code

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
typedef long long ll;
int a[N];
int main() {
  std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
  int n; cin >> n;
  int odd = 0;
  for(int i = 1; i <= n; i++) cin >> a[i], odd += (a[i] & 1);
  if(odd >= 2) { // 两个奇数
    cout << 0 << '\n';
    for(int i = 1; i <= n; i++) {
      while(a[i]--) {
        cout << char('a' + i - 1);
      }
    }
    return 0;
  } 
  ll gcd = a[1];
  for(int i = 2; i <= n; i++) {
    gcd = __gcd(1LL * a[i], gcd);
  }
  cout << gcd << '\n';
  if(odd == 1) { // 一个奇数
    int pos = -1;
    for(int i = 1; i <= n; i++) {
      if(a[i] & 1) pos = i;
    }
    for(int i = 1; i <= gcd; i++) {
      for(int j = 1; j <= n; j++) {
        if(j == pos) continue;
        for(int k = 1; k <= a[j] / gcd / 2; k++) {
          cout << char('a' + j - 1);
        }
      }
      for(int k = 1; k <= a[pos] / gcd; k++) {
        cout << char('a' + pos - 1);
      }
      for(int j = n; j >= 1; j--) {
        if(j == pos) continue;
        for(int k = 1; k <= a[j] / gcd / 2; k++) {
          cout << char('a' + j - 1);
        }
      }
    }
  } else { // 没有奇数
    for(int i = 1; i <= gcd / 2; i++) {
      for(int j = 1; j <= n; j++) {
        for(int k = 1; k <= a[j] / gcd; k++) {
          cout << char('a' + j - 1);
        }
      }
      for(int j = n; j >= 1; j--) {
        for(int k = 1; k <= a[j] / gcd; k++) {
          cout << char('a' + j - 1);
        }
      }
    }
  }
  return 0;
}
Kurisu与牛客的每日一题 文章被收录于专栏

每日一题

全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务