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 ...
随机推荐
- spring学习(5)
bean配置 启用注解 <context:annotation-config/> 使用spring的特殊bean 对bean BeanPostProcessor spring本身提供的特殊 ...
- Selenium-几种操作
元素定位之后就要对它进行操作了,常见的集中操作如下: click() 点击元素 eg.输入内容后,点击操作 send_keys("内容") 模拟按键输入 eg:百度输入框,输入内容 ...
- cocos2d-x CSV文件读取 (Excel生成csv文件)
实现类 CCSVParse.h #ifndef __C_CSV_PARSE__ #define __C_CSV_PARSE__ #include "cocos2d.h" #incl ...
- git branch detached from jb4.2.2_1.0.0-ga
/*************************************************************************** * git branch detached f ...
- params 和 query 传参的区别
很多人都知道params 和 query 都可以在页面跳转的时候传递参数. query更加类似于我们ajax中get传参,params则类似于post,说的再简单一点,前者在浏览器地址栏中显示参数 ...
- properties使用
properties可以load store 注释可以采用 "#" 或者"!" 分隔采用"="或者":" 分行采用&qu ...
- 标准模板库(STL)学习指南之set集合
set是关联容器.其键值就是实值,实值就是键值,不可以有重复,所以我们不能通过set的迭代器来改变set的元素的值,set拥有和list相同的特性:当对他进行插入和删除操作的时候,操作之前的迭代器依然 ...
- POJ1703(2集合并查集)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39402 Accepted: ...
- MFC中如何不使用Unicode字符集
命令窗口:调试->属性-> 把字符集设置为:未设置
- hdu 1074 状态压缩
http://acm.hdu.edu.cn/showproblem.php?pid=1074 我们可以断定状态的终止态一定是n个数全部选完的情况,那么它的前一个状态是什么呢,一定是剔除任一门课程后的n ...