思路:

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;
}

最新文章

  1. Office 365 如何使用powershell查询邮件追踪
  2. YII的Modules模块化
  3. 初始angular框架(2)
  4. java知识巩固
  5. GZIP压缩
  6. Neo4j Index Notes
  7. Search history in &quot;Maps&quot;
  8. 【转】C/C++ struct/class/union内存对齐
  9. JavaIO(03)字节流--OutputStream and InputStream
  10. CSU 1505 酷酷的单词 湖南省赛第十届题目
  11. C++ pair 使用方法
  12. servlet的url-pattern匹配规则详细描述
  13. 测试开发技术:DOM中 innerHTML、innerText、outerHTML、outerText的区别
  14. 自学Unity3D 之 贪吃蛇
  15. LVS集群之工作原理和调度算法(2)
  16. tensorflow import 没找到cudnn库问题解决
  17. Mysql5.7在CentOs环境下定时备份数据库
  18. 第三次作业(ABC类代码优化及感悟)
  19. 20175223 实验一 《JAVA开发环境的熟悉》实验报告
  20. 获取域名,url,指定url参数的方法

热门文章

  1. php发邮件:swiftmailer, php邮件库——swiftmailer
  2. 命令行执行大sql文件
  3. PHP获取指定日期是星期几的实现方法
  4. linux命令学习笔记(39):grep 命令
  5. RTP 打包H264与AAC
  6. ONTAK2010 Peaks加强版
  7. 1030 Travel Plan (30)(30 分)
  8. BZOJ3700: 发展城市
  9. iOS获取设备型号的方法
  10. ng2 中使用echart