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 ...
随机推荐
- sq
CREATE TABLE `message` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NUL ...
- postgreSQL 应用case when的例子
selectname,md5(indvl_id_nbr) as indvl_id_nbr,case when char_length(indvl_id_nbr)=18 or char_length(i ...
- ES5-ES6-ES7_Symbol数据类型
Symbol数据类型简介 ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(Boole ...
- Scrapy 框架 使用 selenium 爬取动态加载内容
使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...
- FinalShell安装
Mac版安装路径/Applications/finalshelldata Linux版安装路径/usr/lib/finalshelldata 注意:1.FinalShell运行需要java或者jdk支 ...
- centos7下安装docker(24docker swarm 数据管理)
service的容器副本会scal up/down,会failover,会在不同的主机上创建和销毁,这就引出一个问题,如果service有数据,那么这些数据该如何存放呢? 1.打包在容器中: 显然不行 ...
- 6-MVC结构简介
一.javeEE的项目结构层次:MVC1.Model:模型层(DAO+业务层) 2.View:视图层 jsp3.Control:控制层 servlet 二.分层的原则:1.层与层之间松耦合,层内保持高 ...
- mysql 索引原理
一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...
- Clustering[Introduction]
0. 聚类步骤 为了完成一个聚类任务,必须遵循以下步骤: 特征选择:合适的选择特征,尽可能多的包含任务关心的信息,使得信息冗余减少和最小化是主要目标: 近邻测度:用于定量测量两个特征向量如何" ...
- c# 打印 主板信息CPU信息
Win32_Processor CPU 参数说明: AddressWidth --在32位操作系统,该值是32,在64位操作系统是64.Architecture --所使用的平台的处理器架构.Asse ...