链接
题目

You are given a string s, consisting of small Latin letters. Let's denote the length of the string as |s|. The characters in the string are numbered starting from 1.

Your task is to find out if it is possible to rearrange characters in string s so that for any prime number p ≤ |s| and for any integer i ranging from 1 to |s| / p (inclusive) the following condition was fulfilled sp = sp × i. If the answer is positive, find one way to rearrange the characters.

Input

The only line contains the initial string s, consisting of small Latin letters (1 ≤ |s| ≤ 1000).

Output

If it is possible to rearrange the characters in the string so that the above-mentioned conditions were fulfilled, then print in the first line "YES" (without the quotes) and print on the second line one of the possible resulting strings. If such permutation is impossible to perform, then print the single string "NO".

Examples
Input
abc
Output
YES
abc
Input
abcd
Output
NO
Input
xxxyxxx
Output
YES
xxxxxxy
Note

In the first sample any of the six possible strings will do: "abc", "acb", "bac", "bca", "cab" or "cba".

In the second sample no letter permutation will satisfy the condition at p = 2 (s2 = s4).

In the third test any string where character "y" doesn't occupy positions 2, 3, 4, 6 will be valid.

题目大意

输入一个字符串,判断能否使每一质数和其倍数位上的字符均相同,能输出YES和任一合法解,否则输出NO

分析

一、例如6即使3的倍数又是2的倍数,所以s[3]=s[6],s[2]=s[6],所以这三位要相同。那我们不妨用并查集来维护一组需要全部相同的下标,父亲记作最小的点。要实现这个目的,我们要先处理出全部质数和其倍数,然后判断1到n的所有质数中如果有一质数i乘另一质数j小于n就将j连在i上。经过这一步可以判断出所有要求字符相同的下标位置。

二、下一步就是判断是否合法。我们不妨列几个数(1、2、3、4、5、6、7、8、9、10),我们不难发现不存在次大集合下标数加第三大集合下标数大于最大集合下标数的可能性,所以我们可以放心大胆的将数量最多的那个字母给最大集合中的这些下表用,然后减掉这些数后重新给各个字母的数量排序(字母一共只有26个,所以不用担心超时)。在判断是否合法时顺便将给各集合的字母记录一下,如果中间走不下去了输出NO,否则输出YES然后把之前记录下的字母按下标输出就大功告成了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int prime[5000],fa[5000],n,t[500000];
char pr[500000];
struct node{
      int t,pl;
}num[50];
struct hhh{
      int t,pl;
}sum[100000];
void init()
{     int i,j,k;
      memset(prime,1,sizeof(prime));
      prime[1]=prime[0]=0;
      fa[1]=1;
      fa[0]=0;
      for(i=2;i<=1100;i++)
         if(prime[i]){
           fa[i]=i;
           for(j=i*2;j<=1100;j+=i){
             prime[j]=0;
             if(!fa[j]);
               fa[j]=i;
           }
         }
}
int sf(int x)
{     return (fa[x]==x?x:fa[x]=sf(fa[x]));
}
void merge()
{     int i,j,k;
      for(i=2;i<=n;i++)
         if(prime[i])
           for(j=i+1;j<=n;j++)
             if(prime[j])
               if(i*j<=n&&fa[i]!=fa[j]){
                   int x,y;
                   x=sf(i);
                   y=sf(j);
                   if(x!=y)
                     fa[y]=x;
               }
}
bool cmp(const node &x,const node &y)
{     return x.t>y.t;
}
bool cmp2(const hhh &x,const hhh &y)
{     return x.t>y.t;
}
int main()
{     int m,i,j,k;
      string s;
      cin>>s;
      n=s.size();
      for(i=0;i<n;i++)
         num[s[i]-'a'+1].t++;
      init();
      merge();
      for(i=1;i<=27;i++)
         num[i].pl=i;
      for(i=1;i<=n;i++)
         sum[sf(i)].t++;
      for(i=1;i<=n;i++)
         sum[i].pl=i;
      sort(sum+1,sum+n+1,cmp2);
      sort(num+1,num+27,cmp);
      k=1;
      while(num[1].t){
          if(!sum[k].t)continue;
          if(num[1].t<sum[k].t){
              puts("NO");
              return 0;
          }
          num[1].t-=sum[k].t;
          t[sum[k].pl]=num[1].pl;
          k++;
          sort(num+1,num+27,cmp);
      }
      puts("YES");
      for(i=1;i<=n;i++)
         pr[i]=t[fa[i]]-1+'a';
      for(i=1;i<=n;i++)
         cout<<pr[i];
      cout<<endl;
      return 0;
}

123 A. Prime Permutation的更多相关文章

  1. Prime Permutation

    Prime Permutation 原题地址: http://codeforces.com/problemset/problem/123/A 题目大意: 给你一个字符串(只包含小写字母),从1开始存放 ...

  2. Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力

    A. Prime Permutation 题目连接: http://www.codeforces.com/contest/123/problem/A Description You are given ...

  3. CodeForces 124C Prime Permutation (数论+贪心)

    题意:给定一个字符串,问你能不能通过重排,使得任意一个素数p <= 字符串长度n,并且 任意的 i <= 长度n/素数p,满足s[p] == s[p*i]. 析:很容易能够看出来,只要是某 ...

  4. C语言程序设计100例之(12):Eratosthenes筛法求质数

    例12   Eratosthenes筛法求质数 问题描述 Eratosthenes筛法的基本思想是:把某范围内的自然数从小到大依次排列好.宣布1不是质数,把它去掉:然后从余下的数中取出最小的数,宣布它 ...

  5. Python学习日记(五)——初识函数(set、深浅拷贝、三目运算、函数、全局变量和局部变量)

    基本数据类型补充 set set集合,是一个无序且不重复的元素集合 #创建 s = {11,22,33,44}#类似字典 s = set() #转换 l = (11,22,33,44) s1 = se ...

  6. Codeforces 1091D New Year and the Permutation Concatenation 找规律,数学 B

    Codeforces 1091D New Year and the Permutation Concatenation https://codeforces.com/contest/1091/prob ...

  7. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  8. [LeetCode] Permutation Sequence 序列排序

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  9. Leetcode 60. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

随机推荐

  1. NC和NO、耳机美标和欧标的区别

    NO是常开(NORMAL OPEN),就是通常即未通电状态下,是断开的,通电后在电磁线圈的作用下(吸合)处于闭合状态.NC是常闭(NORMAL CLOSE),就是通常即未通电状态下,是闭合的,通电后在 ...

  2. AccessibilityService+WindowManager+SurfaceView开系统权限

    一种通过自动获取用户权限增强产品体验的方法 本文是基于辅助功能+悬浮窗+SurfaceView来实现自动获取用户权限的具体方案设计与实现.辅助功能抢红包插件相信大家并不陌生,但是微信官方不允许,但是在 ...

  3. Hadoop伪分布式部署

    一.Hadoop组件依赖关系: 步骤 1)关闭防火墙和禁用SELinux 切换到root用户 关闭防火墙:service iptables stop Linux下开启/关闭防火墙的两种方法 1.永久性 ...

  4. bzoj:1299: [LLH邀请赛]巧克力棒

    原题:http://www.lydsy.com/JudgeOnline/problem.php?id=1299 众多dalao的题解已经很详细了:http://blog.csdn.net/wzq_qw ...

  5. CDOJ 1330 柱爷与远古法阵【高斯消元,卡精度】

    柱爷与远古法阵 Time Limit: 125/125MS (Java/Others)     Memory Limit: 240000/240000KB (Java/Others) Submit S ...

  6. [bzoj1731] [Usaco2005 dec]Layout 排队布局

    差分约束系统...因为题目要求的是1和n的最大距离所以这题就跑最长路.. 对于互相反感的牛(i与j互相反感,彼此距离至少为len,i<j),就有dis[j]-dis[i]>=len.就加一 ...

  7. CodeForces-2015 HIAST Collegiate Programming Contest-Gym-100952A.水题 100952B.水题 100952C.回文字符串 100952D.杨辉三角处理组合数 其他题目待续。。。

    哈哈哈哈哈哈哈,最近一直在补题,改各种错误的代码,wa了20多遍,改到心态爆炸,改好之后,感觉世界都美好了(叉会腰~)... A. Who is the winner? time limit per ...

  8. 2017 ECJTU ACM程序设计竞赛 矩阵快速幂+二分

    矩阵 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission ...

  9. Is It A Tree?(并查集)(dfs也可以解决)

    Is It A Tree? Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submi ...

  10. 了解 Python 语言中的时间处理

    python 语言对于时间的处理继承了 C语言的传统,时间值是以秒为单位的浮点数,记录的是从1970年1月1日零点到现在的秒数,这个秒数可以转换成我们日常可阅读形式的日期和时间:我们下面首先来看一下p ...