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代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #define Max 1010
  4. int main()
  5. {
  6. int pri[Max]; //pri[i]两个状态 1表示是素数,0表示不是素数,注意,c里面初始化为1不能直接在定义中进行
  7. int dp[Max]={}; //dp[i]记录长度为 i 的字符串重复字符的最少个数
  8. int a[]; //26个字符各自出现次数
  9. int mt,ls,i,j,ll;
  10. char mi;
  11. char s[Max],ss[Max];
  12. for(i=;i<Max;i++)
  13. pri[i]=;
  14. pri[]=pri[]=;
  15. dp[]=dp[]=;
  16. for(i=;i<Max;i++)
  17. {
  18. if(pri[i])
  19. {
  20. if(i*<Max)
  21. dp[i*]=;
  22. for(j=*i;j<Max;j+=i)
  23. pri[j]=;
  24. }
  25. }
  26. dp[]=; //经过上面的初始化,dp[4]由于2*2也变成了1,但4并没有连接两个素数,所以取消
  27. for(i=;i<Max;i++)
  28. {
  29. if(pri[i])
  30. dp[i]+=dp[i-];
  31. else
  32. dp[i]+=dp[i-]+;
  33. }
  34. s[]='';
  35. while(scanf("%s",s+)!=EOF)
  36. {
  37. ls=strlen(s);
  38. for(i=;i<;i++)
  39. a[i]=;
  40. for(i=;i<ls;i++)
  41. a[s[i]-'a']++;
  42. for(mt=,i=;i<;i++)
  43. if(a[i]>mt)
  44. {
  45. mt=a[i];
  46. mi=i+'a';
  47. }
  48. if(mt>=dp[ls-])
  49. {
  50. printf("YES\n");
  51. for(ll=,i=;i<ls;i++)
  52. if(s[i]!=mi) ss[ll++]=s[i]; //将s中不是出现最多次的字符存起来
  53. for(i=;i<ls;i++)
  54. if(i>&&(pri[i]==||i*<ls))
  55. {
  56. s[i]=mi; //必须是相同字符的位置放上出现次数最多的字符
  57. mt--; //放上一个就消耗一个mi
  58. }
  59. for(i=;i<ls;i++)
  60. if(i<=||pri[i]&&i*>=ls)
  61. {
  62. if(mt>)
  63. {
  64. mt--; //将还没完的mi消耗完
  65. s[i]=mi;
  66. }
  67. else
  68. {
  69. s[i]=ss[--ll]; //用其他字符填充空缺
  70. }
  71. }
  72. printf("%s\n",s+);
  73. }
  74. else
  75. printf("NO\n");
  76. }
  77. return ;
  78. }

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

    CREATE TABLE `message` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NUL ...

  2. postgreSQL 应用case when的例子

    selectname,md5(indvl_id_nbr) as indvl_id_nbr,case when char_length(indvl_id_nbr)=18 or char_length(i ...

  3. ES5-ES6-ES7_Symbol数据类型

    Symbol数据类型简介 ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(Boole ...

  4. Scrapy 框架 使用 selenium 爬取动态加载内容

    使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...

  5. FinalShell安装

    Mac版安装路径/Applications/finalshelldata Linux版安装路径/usr/lib/finalshelldata 注意:1.FinalShell运行需要java或者jdk支 ...

  6. centos7下安装docker(24docker swarm 数据管理)

    service的容器副本会scal up/down,会failover,会在不同的主机上创建和销毁,这就引出一个问题,如果service有数据,那么这些数据该如何存放呢? 1.打包在容器中: 显然不行 ...

  7. 6-MVC结构简介

    一.javeEE的项目结构层次:MVC1.Model:模型层(DAO+业务层) 2.View:视图层 jsp3.Control:控制层 servlet 二.分层的原则:1.层与层之间松耦合,层内保持高 ...

  8. mysql 索引原理

    一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...

  9. Clustering[Introduction]

    0. 聚类步骤 为了完成一个聚类任务,必须遵循以下步骤: 特征选择:合适的选择特征,尽可能多的包含任务关心的信息,使得信息冗余减少和最小化是主要目标: 近邻测度:用于定量测量两个特征向量如何" ...

  10. c# 打印 主板信息CPU信息

    Win32_Processor CPU 参数说明: AddressWidth --在32位操作系统,该值是32,在64位操作系统是64.Architecture --所使用的平台的处理器架构.Asse ...