【每日一题】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与牛客的每日一题 文章被收录于专栏

每日一题

全部评论

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 14:10
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务