Prime Permutation
Prime Permutation
原题地址: http://codeforces.com/problemset/problem/123/A
题目大意:
给你一个字符串(只包含小写字母),从1开始存放。定义长度为|s|,有1<=|s|<=1000。要求通过调整字符在字符串中的位置,使得: 设p为小于等于|s|的素数,有s[p]=s[p*i] (p*i<=|s|),能够完成该项任务就输出YES和调整后的字符串,不能则输出NO。
大致思路:
由于s[p]=s[p*i],如果|s|足够大,便有: s[2]=s[4]=s[6]=s[8]… s[3]=s[6]=s[9]… s[5]=s[10]…
所以s[3]=s[6]=s[2]=s[10]=s[5],也就是当|s|增大时,就把前面的素数连在一起,所以要求给定的数组中绝大部分的字符应该是一样的,所以我们可以定义一个变量mt,用来记录最大的出现次数,如果mt小于某个值,就输出NO,大于就输出YES。现在的任务就是求出对应字符串长度的这个值,很明显|s+1|的对应值可以由|s|的对应值求来。
现在我们定义一个数组dp[1010],dp[i]记录长度为i的字符串重复字符的最少个数。比如: aabbb 长度为5,有s[2]=s[4],所以dp[5]=2,显然,该字符串可以输出YES。
可以想见: 如果i+1是一个素数,那么dp[i+1]=dp[i],如果i+1不是素数,有dp[i+1]=dp[i]+1;但单单这样是不准确的,因为比如dp[5]=2,5+1不是一个素数,但它的出现不仅影响到本身:s[2]=s[6],还通过s[3]=s[6]影响到3,所以实际上dp[6]=4,即2、3、4、6四位应该是相同的。也就是每当到一定的长度,总会把一些底层素数连在一起,到6时就把2、3连在一起,到10就把2、5连在一起,到14就把2、7连在一起,于是我们可以初始化dp[i*2]=1,i为素数。
AC代码:
#include<stdio.h>
#include<string.h>
#define Max 1010
int main()
{
int pri[Max]; //pri[i]两个状态 1表示是素数,0表示不是素数,注意,c里面初始化为1不能直接在定义中进行
int dp[Max]={}; //dp[i]记录长度为 i 的字符串重复字符的最少个数
int a[]; //26个字符各自出现次数
int mt,ls,i,j,ll;
char mi;
char s[Max],ss[Max];
for(i=;i<Max;i++)
pri[i]=;
pri[]=pri[]=;
dp[]=dp[]=;
for(i=;i<Max;i++)
{
if(pri[i])
{
if(i*<Max)
dp[i*]=;
for(j=*i;j<Max;j+=i)
pri[j]=;
}
}
dp[]=; //经过上面的初始化,dp[4]由于2*2也变成了1,但4并没有连接两个素数,所以取消
for(i=;i<Max;i++)
{
if(pri[i])
dp[i]+=dp[i-];
else
dp[i]+=dp[i-]+;
}
s[]='';
while(scanf("%s",s+)!=EOF)
{
ls=strlen(s);
for(i=;i<;i++)
a[i]=;
for(i=;i<ls;i++)
a[s[i]-'a']++;
for(mt=,i=;i<;i++)
if(a[i]>mt)
{
mt=a[i];
mi=i+'a';
}
if(mt>=dp[ls-])
{
printf("YES\n");
for(ll=,i=;i<ls;i++)
if(s[i]!=mi) ss[ll++]=s[i]; //将s中不是出现最多次的字符存起来
for(i=;i<ls;i++)
if(i>&&(pri[i]==||i*<ls))
{
s[i]=mi; //必须是相同字符的位置放上出现次数最多的字符
mt--; //放上一个就消耗一个mi
}
for(i=;i<ls;i++)
if(i<=||pri[i]&&i*>=ls)
{
if(mt>)
{
mt--; //将还没完的mi消耗完
s[i]=mi;
}
else
{
s[i]=ss[--ll]; //用其他字符填充空缺
}
}
printf("%s\n",s+);
}
else
printf("NO\n");
}
return ;
}
Prime Permutation的更多相关文章
- 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 ...
- 123 A. Prime Permutation
链接 http://codeforces.com/contest/123/problem/A 题目 You are given a string s, consisting of small Lati ...
- CodeForces 124C Prime Permutation (数论+贪心)
题意:给定一个字符串,问你能不能通过重排,使得任意一个素数p <= 字符串长度n,并且 任意的 i <= 长度n/素数p,满足s[p] == s[p*i]. 析:很容易能够看出来,只要是某 ...
- (Problem 70)Totient permutation
Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number ...
- Codeforces 1091D New Year and the Permutation Concatenation 找规律,数学 B
Codeforces 1091D New Year and the Permutation Concatenation https://codeforces.com/contest/1091/prob ...
- 【leetcode】1175. Prime Arrangements
题目如下: Return the number of permutations of 1 to n so that prime numbers are at prime indices (1-inde ...
- [Hello 2020] C. New Year and Permutation (组合数学)
[Hello 2020] C. New Year and Permutation (组合数学) C. New Year and Permutation time limit per test 1 se ...
- Java 素数 prime numbers-LeetCode 204
Description: Count the number of prime numbers less than a non-negative number, n click to show more ...
- Prime Generator
Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate ...
随机推荐
- 图上最短路(Dijkstra, spfa)
单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来 ...
- 【转】TCP和SOCKET关系
socket是TCP/IP协议的API TCP是数据的介质,Socket是TCP的介质. 查了一下RFC文档,Socket是RFC147,更新时间是1971年.TCP是RFC793,更新时间是19 ...
- centos 6.9修改系统默认字符集
[root@ckh ~]# locale –a #列出系统所支持的所有字符集 aa_DJ aa_DJ.iso88591 aa_DJ.utf8 aa_ER aa_ER@saaho aa_ER.utf8 ...
- java让数字显示千分位 mark
/** * 格式化数字为千分位显示: * @param 要格式化的数字: * @return */ public static String fmtMicrometer(String text) { ...
- 微信接入arduino
https://blog.csdn.net/liudongdong19/article/details/81072857 一.准备工作. 1.微信公众号,个人的就可以了,不用企业号什么的. ...
- 在其他Activity中展示自定义相机拍的照片
在使用相机拍照中,我们需要当点击了确定按钮之后,拍的照片展示在其他Activity的ImageView中,代码如下: 1.首先在自定义相机的Activity中,处理点击拍照确定按钮后的逻辑功能:将图片 ...
- jmeter(二十四)dubbo接口测试
最近工作中接到一个需求,需要对一个MQ消息队列进行性能测试,测试其消费能力,开发提供了一个dubbo服务来供我调用发送消息. 这篇博客,介绍下如何利用jmeter来测试dubbo接口,并进行性能测试. ...
- 建一个网站python
域名()+ 服务器+ 源码 制作一个自己的网站.................
- Java面试MySQL的一些问题
MySQL InnoDB存储的文件结构 索引树是如何维护的? 数据库自增主键可能的问题
- flink1.7自定义source实现
flink读取source data 数据的来源是flink程序从中读取输入的地方.我们可以使用StreamExecutionEnvironment.addSource(sourceFunction) ...