链接
题目

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. TCP/IP和UDP之间的区别(转载)

    在分析两者之间的区别之前,我们先搞清楚这两者的关系, TCP/IP协议簇  是一种网络控制协议,简单点说就是一种网络协议,我们网络中的计算机就是通过这套协议簇来进行数据通信的.这套协议簇里面包含了很多 ...

  2. 51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)

    1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,输出 ...

  3. noip级别数论?

    TAT快noip了才开始去接触数论(真心不敢学..)这里做一下整理吧(都是些定义之类的东西= =) 欧几里德:gcd(a,b)=gcd(b,a%b);具体证明见百科? 扩展欧几里德: 求a*x+b*y ...

  4. BZOJ3997: [TJOI2015]组合数学(网络流)

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 405  Solved: 284[Submit][Status ...

  5. 说说 typedef 的那些事

    最近在复习数据结构时,经常看到 typedef 的身影,但始终不清楚 typedef 的用法具体时怎么样的,特地查阅<C Primer Plus 第5版>,并将查到的内容写出来供大家沟通学 ...

  6. bean的作用域 :singleton和prototype

  7. 初步了解关于js跨域问题-jsonp

    js跨域问题是指在js在不同的域中进行数据传输或者数据通信,比如通过ajax向不同的域请求数据(说到ajax,不可避免的就会遇到两个问题:一是ajax是如何传递数据的?二是ajax是如何实现跨域的?) ...

  8. textarea自适应高度,div模仿textarea可编辑实现自适应高度,placeholder使用图标

    1.textarea自适应高度,placeholder使用图标 自适应高度,有很多种办法: 1)jq: $("textarea").on("input",fun ...

  9. 关于IDE与环境变量的一点说明

    环境变量就是当计算机要执行操作时,在环境变量所制定的范围内查找该操作. 比如linux的ls命令,计算机就需要在$PATH规定的目录中寻找该ls的可执行文件. java的classpath,在该规定的 ...

  10. Html5+js测试题【完整版】

    一.闭包的理解:使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露.闭包三个特性: 1.函数嵌套函数 ; 2 ...