思路:
1.如果存在两个奇数,不可能找到回文字符串
2.如果能找到回文串,最多能找到他们的最大公因数
3.然后分不存在奇数和存在一个奇数分类讨论即可
代码
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp(aa,bb) make_pair(aa,bb) #define _for(i,b) for(int i=(0);i<(b);i++) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,b,a) for(int i=(b);i>=(a);i--) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define X first #define Y second #define lowbit(a) (a&(-a)) typedef long long ll; typedef pair<int,int> pii; typedef unsigned long long ull; typedef long double ld; const int N=100010; const int INF=0x3f3f3f3f; const int mod=1e9+7; const double eps=1e-6; const double PI=acos(-1.0); int a[30],odd; vector<pii> even; string s; int c; void solve(){ int n;cin>>n; _for(i,n){ cin>>a[i]; if(a[i]&1) odd++,c=i; else even.pb({i,a[i]}); } if(n==1){ cout<<a[0]<<"\n"; _for(j,a[0]) cout<<'a'; return; } if(odd>1){ cout<<"0\n"; _for(i,n){ _for(j,a[i]) cout<<char('a'+i); } } else if(odd==1){ int ans=a[c]; for(auto t:even){ ans=__gcd(t.Y,ans); } cout<<ans<<"\n"; _for(i,a[c]/ans) s+=char(c+'a'); a[c]-=a[c]/ans; for(auto &t:even){ t.Y/=ans; s+=char('a'+t.X); t.Y--; } for(auto &t:even){ s=char('a'+t.X)+s; t.Y--; } for(auto t:even){ // cout<<t.X<< " "<<t.Y<<"\n"; _for(i,t.Y/2) s+=char('a'+t.X),s=char('a'+t.X)+s; } // cout<<s<<"\n"; _for(i,ans) cout<<s; } else{ int ans=0; for(auto t:even){ if(ans) ans=__gcd(t.Y,ans); else ans=t.Y; } cout<<ans<<"\n"; ans/=2; for(auto &t:even){ t.Y/=ans; s+=char('a'+t.X); t.Y--; } for(auto &t:even){ s=char('a'+t.X)+s; t.Y--; } for(auto t:even){ // cout<<t.X<< " "<<t.Y<<"\n"; _for(i,t.Y/2) s+=char('a'+t.X),s=char('a'+t.X)+s; } // cout<<s<<"\n"; _for(i,ans) cout<<s; } } int main(){ ios::sync_with_stdio(0);cin.tie(0); // int t;cin>>t;while(t--) solve(); return 0; }