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的更多相关文章

  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 ...

  2. 123 A. Prime Permutation

    链接 http://codeforces.com/contest/123/problem/A 题目 You are given a string s, consisting of small Lati ...

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

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

  4. (Problem 70)Totient permutation

    Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number ...

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

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

  6. 【leetcode】1175. Prime Arrangements

    题目如下: Return the number of permutations of 1 to n so that prime numbers are at prime indices (1-inde ...

  7. [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 ...

  8. Java 素数 prime numbers-LeetCode 204

    Description: Count the number of prime numbers less than a non-negative number, n click to show more ...

  9. Prime Generator

    Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate ...

随机推荐

  1. 图上最短路(Dijkstra, spfa)

    单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来 ...

  2. 【转】TCP和SOCKET关系

    socket是TCP/IP协议的API   TCP是数据的介质,Socket是TCP的介质. 查了一下RFC文档,Socket是RFC147,更新时间是1971年.TCP是RFC793,更新时间是19 ...

  3. centos 6.9修改系统默认字符集

    [root@ckh ~]# locale –a #列出系统所支持的所有字符集 aa_DJ aa_DJ.iso88591 aa_DJ.utf8 aa_ER aa_ER@saaho aa_ER.utf8 ...

  4. java让数字显示千分位 mark

    /** * 格式化数字为千分位显示: * @param 要格式化的数字: * @return */ public static String fmtMicrometer(String text) { ...

  5. 微信接入arduino

    https://blog.csdn.net/liudongdong19/article/details/81072857 一.准备工作.      1.微信公众号,个人的就可以了,不用企业号什么的.  ...

  6. 在其他Activity中展示自定义相机拍的照片

    在使用相机拍照中,我们需要当点击了确定按钮之后,拍的照片展示在其他Activity的ImageView中,代码如下: 1.首先在自定义相机的Activity中,处理点击拍照确定按钮后的逻辑功能:将图片 ...

  7. jmeter(二十四)dubbo接口测试

    最近工作中接到一个需求,需要对一个MQ消息队列进行性能测试,测试其消费能力,开发提供了一个dubbo服务来供我调用发送消息. 这篇博客,介绍下如何利用jmeter来测试dubbo接口,并进行性能测试. ...

  8. 建一个网站python

    域名()+  服务器+ 源码 制作一个自己的网站.................

  9. Java面试MySQL的一些问题

    MySQL InnoDB存储的文件结构 索引树是如何维护的? 数据库自增主键可能的问题

  10. flink1.7自定义source实现

    flink读取source data 数据的来源是flink程序从中读取输入的地方.我们可以使用StreamExecutionEnvironment.addSource(sourceFunction) ...