C. Necklace

题目连接:

http://www.codeforces.com/contest/613/problem/C

Description

Ivan wants to make a necklace as a present to his beloved girl. A necklace is a cyclic sequence of beads of different colors. Ivan says that necklace is beautiful relative to the cut point between two adjacent beads, if the chain of beads remaining after this cut is a palindrome (reads the same forward and backward).

Ivan has beads of n colors. He wants to make a necklace, such that it's beautiful relative to as many cuts as possible. He certainly wants to use all the beads. Help him to make the most beautiful necklace.

Input

The first line of the input contains a single number n (1 ≤ n ≤ 26) — the number of colors of beads. The second line contains after n positive integers ai — the quantity of beads of i-th color. It is guaranteed that the sum of ai is at least 2 and does not exceed 100 000.

Output

In the first line print a single number — the maximum number of beautiful cuts that a necklace composed from given beads may have. In the second line print any example of such necklace.

Each color of the beads should be represented by the corresponding lowercase English letter (starting with a). As the necklace is cyclic, print it starting from any point.

Sample Input

3

4 2 1

Sample Output

1

abacaba

Hint

题意

你有n个颜色的珠子,你要把所有珠子都穿成一个圆环

然后你可以从圆环的某一个地方剪开,使得这个链是一个回文串

然后问你怎么样去构造那个圆环,可以使得构成回文串的链最多

题解

考虑对称性,如果答案是ans的话,那么这ans刀一定是等分这个圆环的

每一个块内的珠子数量肯定是相同的

那么显然要满足这两个特性,ans = gcd(a[i])

有两个特殊情况需要考虑

如果存在大于1个颜色的珠子为奇数的话,答案为0,显然

如果有一个颜色的珠子为奇数的话,只要把这个珠子放在中间就好了,相当于把其他的偶数都砍一半,然后去摆放。

代码

#include<bits/stdc++.h>
using namespace std; int p[30];
int odd = 0;
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int main()
{
int n;scanf("%d",&n);
int t = 0;
for(int i=0;i<n;i++)
{
scanf("%d",&p[i]);
if(p[i]%2==1)t=i,odd++;
}
if(odd>1)
{
printf("0\n");
for(int i=0;i<n;i++)
for(int j=0;j<p[i];j++)
printf("%c",'a'+i);
printf("\n");
return 0;
}
if(odd==1)
{
int ans = 0;
for(int i=0;i<n;i++)
{
if(i==t)ans=gcd(p[i],ans);
else ans=gcd(p[i]/2,ans);
}
printf("%d\n",ans);
for(int i=0;i<ans;i++)
{
for(int j=0;j<n;j++)
for(int k=0;k<p[j]/ans/2;k++)
printf("%c",'a'+j);
printf("%c",'a'+t);
for(int j=n-1;j>=0;j--)
for(int k=0;k<p[j]/ans/2;k++)
printf("%c",'a'+j);
}
}
else
{
int ans = 0;
for(int i=0;i<n;i++)
ans=gcd(p[i],ans);
printf("%d\n",ans);
for(int i=0;i<ans/2;i++)
{
for(int j=0;j<n;j++)
for(int k=0;k<p[j]/ans;k++)
printf("%c",'a'+j);
for(int j=n-1;j>=0;j--)
for(int k=0;k<p[j]/ans;k++)
printf("%c",'a'+j);
}
}
}

Codeforces Round #339 (Div. 1) C. Necklace 构造题的更多相关文章

  1. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  2. Educational Codeforces Round 7 D. Optimal Number Permutation 构造题

    D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...

  3. Codeforces Round #339 (Div.2)

    A. Link/Cut Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何

    A. Peter and Snow Blower 题目连接: http://www.codeforces.com/contest/613/problem/A Description Peter got ...

  5. Codeforces Round #339 (Div. 2) B. Gena's Code 水题

    B. Gena's Code 题目连接: http://www.codeforces.com/contest/614/problem/B Description It's the year 4527 ...

  6. Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题

    A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...

  7. Codeforces Round #181 (Div. 2) A. Array 构造

    A. Array 题目连接: http://www.codeforces.com/contest/300/problem/A Description Vitaly has an array of n ...

  8. Codeforces Round #306 (Div. 2) ABCDE(构造)

    A. Two Substrings 题意:给一个字符串,求是否含有不重叠的子串"AB"和"BA",长度1e5. 题解:看起来很简单,但是一直错,各种考虑不周全, ...

  9. Codeforces Round #298 (Div. 2) D. Handshakes 构造

    D. Handshakes Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/534/problem ...

随机推荐

  1. Object的公用方法们

    如图所示,Object一共有10种方法: 下面详细描述: 1.public Object() 方法,默认构造函数方法,当新建一个Object对象的时候,调用这个方法向堆区申请一片内存: 2.priva ...

  2. 【Android framework】AndroidManagerService初始化流程

    源码基于Android 4.4.   system_server的初始化 system_server受AMS管理,负责启动framework-res.apk和SettingsProvider.apk. ...

  3. node.js2

    同步是指:同步阻塞操作,异步是指:异步非阻塞操作. 第一部分:fs模块 1.引入fs模块 require('fs'); 2.写文件 01.异步写:writeFile fs.writeFile(path ...

  4. C语言string转int

    再不用atoi函数接口时,将字符串型转换成整型. 例如:将字符串型“158”转换成整型158 int String2Int(char * buff) { ; ; '; index++) { value ...

  5. Linux下源码安装jdk

    1.到官网下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  6. LoadRunner读取文件并验证

            checkprocess()  {  char command[1024];  int i, total = 0;  char buffer[12], ch;  char *filen ...

  7. jdk之object源码理解

    Java所有类都继承与Object,本文谈谈我对object源码的理解,如果有错的,请看官多多批评指正. 1.registerNatives() private static native void ...

  8. selinux关闭

    查看SELinux状态: 1./usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态 SELinux status:         ...

  9. 4.Spark Streaming事务处理

    首先,我们必须知道什么是事务及其一致性? 事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性. 原子性(atomicity).一个事务是一个不可分割的工作单位,事务中 ...

  10. Mac OS X系统下的Android环境变量配置

    在Mac下开发Android,要想在终端利用命令行使用adb/android等命令时,需要配置一下环境变量. 步骤: 1.首先,假设你已经下载了Android SDK,解压后安装了adb.记住sdk文 ...