【CodeForces - 124C】Prime Permutation(数学,思维,小结论)

题干:

You are given a string s, consisting of small Latin letters. Let's denote the length of the string as |s|. The characters in the string are numbered starting from 1.

Your task is to find out if it is possible to rearrange characters in string s so that for any prime number p ≤ |s| and for any integer i ranging from 1 to |s| / p(inclusive) the following condition was fulfilled sp = sp × i. If the answer is positive, find one way to rearrange the characters.

Input

The only line contains the initial string s, consisting of small Latin letters (1 ≤ |s| ≤ 1000).

Output

If it is possible to rearrange the characters in the string so that the above-mentioned conditions were fulfilled, then print in the first line "YES" (without the quotes) and print on the second line one of the possible resulting strings. If such permutation is impossible to perform, then print the single string "NO".

Examples

Input

abc

Output

YES
abc

Input

abcd

Output

NO

Input

xxxyxxx

Output

YES
xxxxxxy

Note

In the first sample any of the six possible strings will do: "abc", "acb", "bac", "bca", "cab" or "cba".

In the second sample no letter permutation will satisfy the condition at p = 2 (s2 = s4).

In the third test any string where character "y" doesn't occupy positions 2, 3, 4, 6 will be valid.

题目大意:

给你一个字符串(len<=1000),让你找到它的另一个排列,使得任意一个素数的倍数的位置上的字符相同。

解题报告:

先说正解:不难发现,除了1和大于len/2的素数  其他都需要是同一个数。

证明如下:对于小于等于len/2的数,如果他是合数,那肯定要和2位置上的字符相同,如果他是素数,假设为p,那他要和2*p的位置相同,而2*p的位置和2的相同,所以也要相同。对于大于len/2的数,显然。

再说另一种做法:并查集,最直观的想法,但是实现的时候有个问题,见下面的代码,如果加上getf那一行循环,对于len==20左右的时候就GG,直接在下面cmp1那个排序中死循环,不知道为什么。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
char s[MAX];
bool is[MAX];
int n;
struct Node {char ch;int cnt;bool operator<(const Node & b) const {return cnt < b.cnt;}
} R[MAX];
struct NNode {int f,num,id;
} W[MAX],WW[MAX];
bool cmp1(NNode a,NNode b) {if(a.f == b.f) return 1;else return WW[a.f].num < WW[b.f].num;
}
bool cmp2(NNode a,NNode b) {return a.id < b.id;
}
int getf(int v) {return W[v].f == v ? v : W[v].f = getf(W[v].f);
}
void merge(int u,int v) {int t1 = getf(u),t2=getf(v);if(t1 == t2) return;W[t2].f = t1;W[t1].num += W[t2].num;
}
void init() {memset(is,1,sizeof is);is[0]=is[1]=0;for(int i = 2; i<=n; i++) {if(is[i] == 0) continue;for(int j = i+i; j<=n; j+=i) {is[j] = 0;merge(i,j);}}
}
char ans[MAX];
int main()
{	for(char i = 'a'; i<='z'; i++) R[i].ch=i,R[i].cnt=0; scanf("%s",s+1); n = strlen(s+1);for(int i = 1; i<=n; i++) W[i].f=i,W[i].num=1,W[i].id=i,R[s[i]].cnt++;	init();sort(R+'a',R+'z'+1); 
//	for(int i = 1; i<=n; i++) getf(i);for(int i = 1; i<=n; i++) WW[i]=W[i];sort(W+1,W+n+1,cmp1);int cur = 'a',flag=1;//注意cur只代表ascll码,不代表此时字符就是a字符,因为你已经排序了 for(int i = 1; i<=n; i++) {while(R[cur].cnt == 0 && cur <= 'z') cur++;if(cur == 'z'+1) {flag=0;break;	}ans[W[i].id] = R[cur].ch;R[cur].cnt--;}sort(W+1,W+n+1,cmp2);//排序还原回原序列 使得和getf可以对应上for(int i = 1; i<=n; i++) {if(ans[i] != ans[getf(i)]) flag = 0; }if(flag == 0) {puts("NO");return 0;}puts("YES");printf("%s",ans+1);return 0 ;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java同步锁——lock与synchronized 的区别【转】

在网上看来很多关于同步锁的博文&#xff0c;记录下来方便以后阅读 一、Lock和synchronized有以下几点不同&#xff1a; 1&#xff09;Lock是一个接口&#xff0c;而synchronized是Java中的关键字&#xff0c;synchronized是内置的语言实现&#xff0c;synchronized是在JVM层面…

Coursera自动驾驶课程第6讲:Vehicle Longitudinal Control

在上一讲《Coursera自动驾驶课程第5讲&#xff1a;Vehicle Dynamic Modeling》中我们了解了汽车运动学和动力学模块。 本讲我们继续学习新的模块&#xff1a;汽车纵向控制。具体地&#xff0c;我们将学习PID控制算法&#xff0c;看看该算法是如何在自动驾驶汽车中应用的。 B站…

【CodeForces - 599C 】Day at the Beach(思维)

题干&#xff1a; 给定一个数列A&#xff0c;要求你将这个数列划分成几个连续的部分&#xff0c;使得每部分分别从小到大排序后整个数列有序。 问最多可以划分成几个部分。 Input 第一行包含一个整数 n (1 ≤ n ≤ 100 000) — 表示数列的长度 之后一行 n 个整数 hi …

Java并发:线程共享变量可见性原理

0、线程安全性&#xff1a;线程安全性包括两个方面&#xff0c;①可见性。②原子性。 0.1、线程之间的通信&#xff1a;线程的通信是指线程之间以何种机制来交换信息。在命令式编程中&#xff0c;线程之间的通信机制有两种共享内存和消息传递。 &#xff08;1&#xff09;在共…

Coursera自动驾驶课程第7讲:Vehicle Lateral Control

在上一讲《Coursera自动驾驶课程第6讲&#xff1a;Vehicle Longitudinal Control》中我们了解了如何使用PID算法进行汽车纵向控制。 本讲我们继续学习新的模块&#xff1a;汽车横向控制。具体地&#xff0c;我们将学习三种控制算法&#xff1a;Pure pursuit&#xff0c;Stanle…

【CodeForces - 697C】Lorenzo Von Matterhorn(二叉树,思维)

题干&#xff1a; 巴尼住在NYC。NYC具有从1开始的正整数编号的无数个交叉点。在交叉点 i 和 2i 之间以及 i和 2i  1 之间存在双向道路&#xff0c;对任意整数 i 都满足。在任意两点之间都有且只有一条最短路。 最初任何人都可以通过任何道路免费。 但是后来发生了 q 个事件。…

Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision

在上一讲《Coursera自动驾驶课程第7讲&#xff1a;Vehicle Lateral Control》中我们了解了如何对汽车进行横向控制。 本课程第一个篇章就暂时告一段落了&#xff0c;接下来我们开始学习新的篇章。 课程第二个篇章是状态估计和定位模块。不过在这里我做了一下调整&#xff0c;我…

volatile和synchronized的区别与联系

这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符&#xff0c;而synchronized是一个方法或块的修饰符。所以我们使用这两种关键字来指定三种简单的存取变量的方式。 int i1; int geti1() { return i1; } volati…

【CodeForces - 628C】Bear and String Distance(贪心,构造)

Description 定义两个小写字母之间的距离为这两个字母在字母表中的距离&#xff0c;如dis(a,z)25,dis(a,c)2&#xff0c;两个长度相同串的距离为这两个串对应位置字母距离之和。现给出一个长度为n的串s和一个距离k&#xff0c;问是否存在一个长度为n的串ss&#xff0c;使得dis…

Coursera自动驾驶课程第9讲:Visual Features Detection Description and Matching

在上一讲《Coursera自动驾驶课程第8讲&#xff1a;Basics of 3D Computer Vision》中我们学习了计算机视觉基本知识。 本讲我们将学习计算机视觉中的视觉特征模块。 B站视频链接&#xff1a;https://www.bilibili.com/video/BV1PE411D72p 文章目录1. Introduction to Image f…

【CodeForces - 514C】Watto and Mechanism(字符串哈希)

题干&#xff1a; 输入n个字符串&#xff0c;然后进行m次询问&#xff0c;每次询问输入一个字符串&#xff0c;问n个字符串中是否存在与当前输入的字符串长度相等&#xff0c;并且刚好有且仅有一个位置的字符不同。存在则输出YES&#xff0c;不存在输出NO。 Examples Input …

并发编程(原子性、可见性、一致性)

1、原子性&#xff08;Atomicity&#xff09; 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度&#xff0c;既不被中断操作&#xff0c;要不执行完成&#xff0c;要不就不执行。 如果一个操作时原子性的&#xff0c;那么多线程并发的情况下&#xff0c;就不会出现变…

Coursera自动驾驶课程第10讲:Feedforward Neural Networks

在上一讲《Coursera自动驾驶课程第9讲&#xff1a;Visual Features Detection Description and Matching》中我们学习了如何进行图像特征检测&#xff0c;特征匹配以及如何构建视觉里程计来估计相机的运动。 本讲我们将学习神经网络模块&#xff0c;关于神经网络或深度学习网上…

【CodeForces - 514D】R2D2 and Droid Army(二分+滑动窗口ST表,或 尺取+单调队列或STLmultiset)

题干&#xff1a; An army of n droids is lined up in one row. Each droid is described by m integers a1, a2, ..., am, where ai is the number of details of the i-th type in this droids mechanism. R2-D2 wants to destroy the sequence of consecutive droids o…

守护进程和守护线程

对于JAVA而言&#xff0c;一般一个应用程序只有一个进程——JVM。除非在代码里面另外派生或者开启了新进程。 而线程&#xff0c;当然是由进程开启的。当开启该线程的进程离开时&#xff0c;线程也就不复存在了。 所以&#xff0c;对于JAVA而言&#xff0c;线程是完全可以由自…

Coursera自动驾驶课程第11讲:2D Object Detection

在上一讲《Coursera自动驾驶课程第10讲&#xff1a;Feedforward Neural Networks》中我们学习了神经网络的基础知识&#xff0c;包括损失函数&#xff0c;梯度下降&#xff0c;正则化&#xff0c;卷积网络等。 本讲我们将学习深度学习的一个重要应用&#xff1a;图像目标检测。…

【CodeForces - 460C】Present(二分+树状数组)

题干&#xff1a; 给定N朵花的原先的高度&#xff0c;从左到右排列&#xff0c;最多浇水m天&#xff0c;每天只能浇一次&#xff0c;每次使得连续的w朵花的高度增长1&#xff0c;问最后最矮的花的高度最高是多少。 Examples Input 6 2 3 2 2 2 2 1 1Output 2Input 2 5 1 …

多线程知识梳理(1) - 并发编程的艺术笔记

第三章 Java内存模型 3.1 Java内存模型的基础 通信 在共享内存的模型里&#xff0c;通过写-读内存中的公共状态进行隐式通信&#xff1b;在消息传递的并发模型里&#xff0c;线程之间必须通过发送消息来进行显示的通信。同步 在共享内存并发模型里&#xff0c;同步是显示进行…

Coursera自动驾驶课程第12讲:Semantic Segmentation

在上一讲《Coursera自动驾驶课程第11讲&#xff1a;2D Object Detection》我们学习了深度学习的一个重要应用&#xff1a;目标检测。 本讲我们将学习深度学习的另一个重要应用&#xff1a;语义分割。这是图片像素级的一个重要应用。 B站视频链接&#xff1a;https://www.bili…

【CodeForces - 697D】Puzzles(树形dp,期望dp)

题目大意&#xff1a; 给定一棵树&#xff0c;从1开始&#xff0c;按DFS的方式访问这棵树 每次从父亲节点随机访问儿子&#xff0c;问每个节点被访问到的时间的期望 输入&#xff1a;第一行一个数n&#xff0c;代表n个节点。第二行n-1个数p2,p3,p4,p5...,pn-1&#xff0c;其…