CodeForces 124C【连通块】
思路:
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【连通块】的更多相关文章
- 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 ...
- 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 ...
- C. Edgy Trees Codeforces Round #548 (Div. 2) 【连通块】
一.题面 here 二.分析 这题刚开始没读懂题意,后来明白了,原来就是一个数连通块里点数的问题.首先在建图的时候,只考虑红色路径上的点.为什么呢,因为为了不走红色的快,那么我们可以反着想只走红色的路 ...
- CodeForces 690D1 The Wall (easy) (判断连通块的数量)
题意:给定一个图,问你有几个连通块. 析:不用说了,最简单的DFS. 代码如下: #include <bits/stdc++.h> using namespace std; const i ...
- Codeforces 920E Connected Components? 补图连通块个数
题目链接 题意 对给定的一张图,求其补图的联通块个数及大小. 思路 参考 ww140142. 维护一个链表,里面存放未归入到任何一个连通块中的点,即有必要从其开始进行拓展的点. 对于每个这样的点,从它 ...
- Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力
A 水题 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace ...
- 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 ...
- DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)
题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...
- UVA 572 油田连通块-并查集解决
题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...
- HD1269迷宫城堡(有向图 && 划分连通块)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- 初学Linux笔记
自动获取IP地址的局域网中,用的是DHCP服务器
- Ueditor基础使用
感谢大家对我这个菜鸟的帮助,这是我第一次用.NET做网站.在这里向大家推荐个百度免费的文本编辑器Ueditor,是.NET版的,在http://ueditor.baidu.com/website/in ...
- Linux学习过程中的简单命令
1.su su- 与 sudo (1) 普通用户和root转换:su 用户名或root 不知道root密码的情况下:普通 -> root:sudo su roo ...
- Struts2 - 文件的上传和下载
1. 前言 这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 2. 具体内容 回到顶部 2.1Struts2文件上传 2.1.1单 ...
- git克隆某一个branch
git clone -b <branch> <remote_repo> 例如: git clone -b 指定的分支名字
- c/c++写的比较好的读写配置文件的函数或者类
共用版 .h文件 //---------------------------------------------------------------------------- // 程序名称: ...
- LiveMediaStreamer
LiveMediaStreamer is an open source multimedia framework that allows the manipulation of multiple au ...
- bzoj 2118: 墨墨的等式 spfa
题目: 墨墨突然对等式很感兴趣,他正在研究\(a_1x_1+a_2y_2+ ... +a_nx_n=B\)存在非负整数解的条件,他要求你编写一个程序,给定\(N,\{a_n\}\)以及\(B\)的取值 ...
- Oracle 12c 多租户 CDB 与 PDB 备份
一. CDB 备份 1.1 只备份CDB 只备份CDB数据库需要具有SYSDBA或SYSBACKUP权限用户连接到CDB的root环境下,执行backupdatabase root命令即可完成对C ...
- JS数组的sort排序
数组sort方法排序var aa=[6,2,1,5]//默认是从小到大排序aa.sort()[1, 2, 5, 6] //下面也是从小到大排序aa.sort(function(a,b){return ...