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. jsp 或 php 等view之中使用javascript简单处理的使用技巧

    前端人员在jsp,php等后台mvc之的coding之时,前端人员常常需要一些少量的数据处理,直接使用js的方法无疑是开销最小的.使用的方法 使用在标签之中嵌套script标签,使用document. ...

  2. form表单post请求乱码问题

    今天做一个查询的小模块遇到了 请求乱码的问题,表单请求方式是post 解决方法是在web.xml 文件中配置一下内容 <!--配置解决post乱码问题filter --> <filt ...

  3. Linux:Day24(下) samba

    samba: smb:Service Message Block 是一种协议 CIFS:Common Internet File System smb --> samba 137/udp,138 ...

  4. 【vue】vue中ref用法

    1.获取当前元素: 例子: <div class="pop pos-a" :style="{ left: pop_x + 'px' ,top: pop_y + 'p ...

  5. How to get Docker

    Docker 通俗的理解就是像VM一样的虚拟技术,但是不完全相同. Docker可以打包为镜像文件,在镜像中运行容器. 镜像和容器可以理解成类和对象的关系. 拿VM虚拟机和docker来举例,一个容器 ...

  6. 六、Oracle 存储过程

    一.存储过程1语法:create procedure 名字is|as 声明变量begin 代码块end; 2.执行存储过程打开命令窗口,输入:exec 过程名字 3.打开输出命令:set server ...

  7. Troubleshooting ORA-12547 TNS: Lost Contact (Doc ID 555565.1)

    Troubleshooting ORA-12547 TNS: Lost Contact (Doc ID 555565.1) This error can occur in following scen ...

  8. selenium中遇到div弹框,一起引申到其他弹框

    1.div弹框和DOM普通元素一样处理 2.出现一下就自动消失的弹框,也是在DOM中有描述的,可以使用xpath,用其内容定位 3.(转,其他弹框处理,包括alert和不同windows) https ...

  9. python3 练习题 day03

    ''' 1. 文件a1.txt内容 序号 部门 人数 平均年龄 备注 1 python 30 26 单身狗 2 Linux 26 30 没对象 3 运营部 20 24 女生多 ....... 通过代码 ...

  10. vue是一个渐进式的框架,如何理解“渐进式”

    每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式.使用vue,你可以在原有大系统的上面,把一两个组件改用它实现 ...