123 A. Prime Permutation
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.
The only line contains the initial string s, consisting of small Latin letters (1 ≤ |s| ≤ 1000).
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".
abc
YES
abc
abcd
NO
xxxyxxx
YES
xxxxxxy
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的更多相关文章
- Prime Permutation
Prime Permutation 原题地址: http://codeforces.com/problemset/problem/123/A 题目大意: 给你一个字符串(只包含小写字母),从1开始存放 ...
- 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 ...
- CodeForces 124C Prime Permutation (数论+贪心)
题意:给定一个字符串,问你能不能通过重排,使得任意一个素数p <= 字符串长度n,并且 任意的 i <= 长度n/素数p,满足s[p] == s[p*i]. 析:很容易能够看出来,只要是某 ...
- C语言程序设计100例之(12):Eratosthenes筛法求质数
例12 Eratosthenes筛法求质数 问题描述 Eratosthenes筛法的基本思想是:把某范围内的自然数从小到大依次排列好.宣布1不是质数,把它去掉:然后从余下的数中取出最小的数,宣布它 ...
- Python学习日记(五)——初识函数(set、深浅拷贝、三目运算、函数、全局变量和局部变量)
基本数据类型补充 set set集合,是一个无序且不重复的元素集合 #创建 s = {11,22,33,44}#类似字典 s = set() #转换 l = (11,22,33,44) s1 = se ...
- Codeforces 1091D New Year and the Permutation Concatenation 找规律,数学 B
Codeforces 1091D New Year and the Permutation Concatenation https://codeforces.com/contest/1091/prob ...
- Permutation Sequence
The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- [LeetCode] Permutation Sequence 序列排序
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- 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 ...
随机推荐
- WebAPI 实现前后端分离
随着Web技术的发展,现在各种框架,前端的,后端的,数不胜数.全栈工程师的压力越来越大. 现在的前端的框架,既可以做各种Web,又可以做各种APP,前端框架更新换代越来越快,越来越多. 传统的模式 前 ...
- ajax解决跨域问题
1.在介绍之前先介绍几个概念 json: { date: "Sun Dec 24 21:44:42 CST 2017", temperature: "21", ...
- 使用mysql悲观锁解决并发问题
最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持 ...
- kafka快速入门(官方文档)
第1步:下载代码 下载 1.0.0版本并解压缩. > tar -xzf kafka_2.11-1.0.0.tgz > cd kafka_2.11-1.0.0 第2步:启动服务器 Kafka ...
- Axios使用说明
vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios ...
- 我的第五个网页制作:pre、html转义、abbr标签的使用
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Codeforces Round #336 (Div. 2)【A.思维,暴力,B.字符串,暴搜,前缀和,C.暴力,D,区间dp,E,字符串,数学】
A. Saitama Destroys Hotel time limit per test:1 second memory limit per test:256 megabytes input:sta ...
- 2017ccpc哈尔滨区域赛H
n堆石子 每次只能拿一个石子从一堆移到另一堆 知道所有的堆的石子数目都能整除x(x>1) 问最小移动次数 枚举x的可能取值 即a[i]和的素因子即可 合因子的区间变化会比较大 然后求余 ...
- c#中winform窗口的隐藏与显示
最近在做一个C# 的winform客户端程序,要实现在打开新的窗口时将原来打开的窗口关闭,但是想在关闭新打开的窗口是将原来的那个窗口再次打开,在网上查找各种资料,找了很多代码,都是通过窗口.Hide( ...
- jdbc、Mybatis插入数据主键回显的实现方法
插入数据的时候,往往需要获取主键值.但是有时候主键是自增长的那么,就不太适用手动添加主键值了,此时需要一种可以回显主键参数的方法, 下面以jdbc.mybatis的实现举例 此时使用的是jdbc的话或 ...