Codeforces 123A. Prime Permutation

来源:互联网 发布:网络下单系统 编辑:程序博客网 时间:2024/05/20 14:15
看了题解找的规律之后,其实很简单,但是还是做了好久...
规律就是:2到len/2和len/2之后的合数位置上的字母都必须一样,其余的补全就好了,下标从1开始会比较方便!
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;bool is_prime(int x){if(x == 1)return false;for(int i=2; i*i<=x; i++)if(x % i == 0)return false;return true;}char s[1005];int cnt[30];char res[1005];int main(){while(cin >> s){memset(cnt, 0, sizeof(cnt));memset(res, 0, sizeof(res));int maxn=0;int index=-1;int flag=1;int len = strlen(s);if(len <= 3){cout << "YES" << endl;cout << s << endl;continue;}for(int i=0; i<len; i++)cnt[s[i]-'a']++;for(int i=0; i<30; i++){if(maxn < cnt[i]){maxn = cnt[i];index = i;}}char s2 = index+'a';for(int i=1; i<=len; i++){if(i >= 2 && i <= len/2 || i>len/2 && !is_prime(i)){res[i] = s2;maxn--;cnt[index]--;}if(maxn < 0){flag=0;break;}}for(int i=1; i<=len; i++){if(res[i] == 0){for(int j=0; j<30; j++){if(cnt[j]){res[i] = j + 'a';cnt[j]--;break;}}}}if(!flag)cout << "NO" << endl;else{cout << "YES" << endl;for(int i=1; i<=len; i++)cout << res[i];cout << res << endl;}}return 0;}

0 0
原创粉丝点击