题意:
给你n种珠子,每种珠子ai颗,用全部珠子组成一条项链,项链最多有多少个切点为美丽的,美丽的为切完后为回文串,并输出其中的一种方案。
思路:
由于我们需要的是回文串,如果有两种珠子个数为奇数则一定不能构成回文串,否则一定存在回文串,切点个数等于ai的最大公约数,具体构造参考代码。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; int a[205]; char b[1000005]; int main() { int n; scanf("%d",&n); int ji=0, ki=-1, sum=0, l, r, ans=0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); if(i==0) { ans=a[i]; } else { ans=__gcd(ans,a[i]); } if(a[i]%2==1) { ji++; } sum=sum+a[i]; } if(ji>1) { printf("0\n"); for(int i=0; i<n; i++) { for(int j=0; j<a[i]; j++) { printf("%c",i+'a'); } } } else { ji=0; for(int i=0; i<n; i++) { a[i]=a[i]/ans; if(a[i]%2==1) { ji++; ki=i; } } if(ji>1) { printf("%d\n",ans); ans=ans/2; ji=0; sum=sum/ans; for(int i=0; i<n; i++) { a[i]=a[i]*2; } for(int k=0; k<ans; k++) { int l=0+k*sum, r=sum-1+k*sum; for(int i=0; i<n; i++) { for(int j=0; j<a[i]; j=j+2) { b[l++]='a'+i; b[r--]='a'+i; } } } } else { printf("%d\n",ans); a[ki]--; ji=0; sum=sum/ans; for(int k=0; k<ans; k++) { int l=0+k*sum, r=sum-1+k*sum; for(int i=0; i<n; i++) { for(int j=0; j<a[i]; j=j+2) { b[l++]='a'+i; b[r--]='a'+i; } } b[l]=ki+'a'; } } for(int i=0; i<sum*ans; i++) { printf("%c",b[i]); } } printf("\n"); return 0; }