思路:

a素数->b合数

c素数->b合数

a,c属于一类

so,预处理相同的,并且计数。1000怎么搞都无压力;

我这里也预处理了字母个数,从集合大的枚举下来,每次拿字母个数最多的去匹配。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; const int N=1e3+10; bool isprime(int x)
{
if(x==1) return false;
int q=sqrt(x);
for(int i=2; i<=q; i++)
if(x%i==0) return false;
return true;
} pair<int,int>sum[1010];
int ssum[30]; char s[N],ans[N];
bool vis[N];
int n;
vector<int>prime;
vector<int>num[200]; void init()
{
for(int i=1; i<=1000; i++)
if(isprime(i)) prime.push_back(i);
} int pre[N];
int Find(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];
int i=x,j;
while(pre[i]!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
} pair<int,int>xs[1010];
vector<int>pp[1010]; int main()
{
//预处理素数
init(); scanf("%s",s+1);
n=strlen(s+1); //求和
for(int i=1; i<=n; i++)
{
int x=s[i]-'a';
ssum[x]++;
}
for(int i=0; i<26; i++)
{
sum[i].first=ssum[i];
sum[i].second=i;
} //分块。
int sz=prime.size();
int ssz=sz;
for(int i=0; i<sz; i++)
{
if(prime[i]>n)
{
ssz=i;
break;
}
for(int k=1; k<=n; k++)
{
if(k*prime[i]>n) break;
num[i].push_back(k*prime[i]);
}
}
for(int i=1; i<=n; i++)
pre[i]=i;
for(int i=0; i<ssz; i++)
{
int u=prime[i];
int sss=num[i].size();
for(int k=0; k<sss; k++)
{
int v=num[i][k];
int uu=Find(u);
int vv=Find(v);
if(uu!=vv)
pre[uu]=vv;
}
}
//建立 集合个数 和 集合元素
for(int i=1;i<=n;i++)
xs[i].first=0;
for(int i=1; i<=n; i++)
{
int x=Find(i);
xs[x].first++;
xs[x].second=x;
pp[x].push_back(i);
} //从大到小
sort(xs+1,xs+n+1);
sort(sum,sum+26);
// for(int i=n;i>=1;i--)
// {
// printf("%d %d\n",xs[i].first,xs[i].second);
// }
// for(int j=25;j>=23;j--)
// {
// printf("%d\n",sum[j].first);
// }
for(int i=n; i>=1; i--)
{
int sz=xs[i].first; //集合个数
int x=xs[i].second; //集合老大
if(pp[x].size()==0) break;
bool flag=false;
int j=25;
if(sum[j].first>=sz)
{
for(int k=0; k<sz; k++)
ans[pp[x][k]-1]=sum[j].second+'a';
sum[j].first-=sz;
}
else
flag=true;
sort(sum,sum+26);
if(flag)
{
puts("NO");
return 0;
}
}
ans[n]='\0';
puts("YES");
printf("%s\n",ans);
return 0;
}

CodeForces 124C【连通块】的更多相关文章

  1. Codeforces Round #375 (Div. 2)——D. Lakes in Berland(DFS连通块)

    D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. C. Edgy Trees Codeforces Round #548 (Div. 2) 并查集求连通块

    C. Edgy Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. C. Edgy Trees Codeforces Round #548 (Div. 2) 【连通块】

    一.题面 here 二.分析 这题刚开始没读懂题意,后来明白了,原来就是一个数连通块里点数的问题.首先在建图的时候,只考虑红色路径上的点.为什么呢,因为为了不走红色的快,那么我们可以反着想只走红色的路 ...

  4. CodeForces 690D1 The Wall (easy) (判断连通块的数量)

    题意:给定一个图,问你有几个连通块. 析:不用说了,最简单的DFS. 代码如下: #include <bits/stdc++.h> using namespace std; const i ...

  5. Codeforces 920E Connected Components? 补图连通块个数

    题目链接 题意 对给定的一张图,求其补图的联通块个数及大小. 思路 参考 ww140142. 维护一个链表,里面存放未归入到任何一个连通块中的点,即有必要从其开始进行拓展的点. 对于每个这样的点,从它 ...

  6. Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力

    A 水题 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace ...

  7. Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...

  8. DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)

    题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...

  9. UVA 572 油田连通块-并查集解决

    题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...

  10. HD1269迷宫城堡(有向图 && 划分连通块)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 仿联想商城laravel实战---5、无刷新的增删改查(动态页面更新的三种方式(html))

    仿联想商城laravel实战---5.无刷新的增删改查(动态页面更新的三种方式(html)) 一.总结 一句话总结: 直接js增加删除修改html 控制器直接返回处理好的页面 用双向绑定插件比如vue ...

  2. PHP限制IP访问 只允许指定IP访问 允许*号通配符过滤IP

    /** * 检测访问的ip是否为规定的允许的ip * Enter description here ... */ function check_ip(){ $ALLOWED_IP=array('192 ...

  3. POJ 2240 Arbitrage(Floyed-Warshall算法)

    题意:给出n种货币,m种兑换比率(一种货币兑换为另一种货币的比率),判断测试用例中套汇是否可行.(套汇的意思就是在经过一系列的货币兑换之后,是否可以获利.例如:货币i→货币j→货币i,这样兑换后,是否 ...

  4. type_traits.h

    type_traits.h // Filename: type_traits.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: ht ...

  5. Android DOM解析XML方法及优化

    在Android应用开发中,我们常常要在应用启动后从服务器下载一些配置文件,这些配置文件包含一些项目中可能用到的资源,这些文件很多情况下是XML文件,这时就要将XML下载到文件中保存,之后再解析XML ...

  6. Android之单元测试学习

    1.单元测试概念 单元测试(又称为模块测试),检验程序模块(软件设计的最小单位)正确性的测试工作,常常是程序员写的一段代码.对于面向对象编程,最小单元就是方法,包括基类(超类).抽象类.或者派生类(子 ...

  7. 2017-2018-1 20179203 《Linux内核原理与分析》第五周作业

    攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...

  8. [Codeforces 1139D] Steps to One

    [题目链接] https://codeforces.com/contest/1139/problem/D [算法] 考虑dp 设fi表示现在gcd为i , 期望多少次gcd变为1 显然 , fi = ...

  9. tiny4412sdk-1506原生uboot卡死

    于16年2月多购买了tiny4412sdk-1506,用友善之臂(以下简称友善)的superboot是可以进入linux,而用三星原始的uboot_tiny4412-20130729则不可以.出现现象 ...

  10. 洛谷【P3952】NOIP2017提高组Day1T2时间复杂度

    我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P395 ...