BestCoder Round #93 ABC
A:
题目大意:
将数组划分成最少的段,每段的数两两不同。
题解:直接用一个map记录一个数是否出现过,贪心的每次取最多个数就好。
B:
题目大意:
给出一个0-9组成的字符串,问能否删掉K个数字,使得最后形成的数没有前导零且能被3整除。
题解:
最后会留下N-K个数,枚举第一个数的位置,然后问题就可以转化为判断同余方程0*x+1*y+2*z = v (mod 3) 是否有解。 其中(x+y+z=K-1 && x<=a && y<=b && z<=c)
设:
x = i (mod 3)
y = j (mod 3)
z = k (mod 3)
在[0,2]范围里枚举i,j,k
然后可行的条件是:
1. i<=a , j <=b , k <=c
2. 0*i+1*j+2*k = v (mod 3)
3. i+j+k <= K-1
4. 3*( (a-i)/3+(b-j)/3+(c-k)/3 )+ i+ j + k >= K-1
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
using namespace std; #define X first
#define Y second
#define N 100010
#define M 500010 typedef long long ll;
const int INF=1ll<<; char s[N];
int dp[N][],suf[N][]; bool Check(int a,int b,int c,int r,int n)
{
for (int i=;i< && i<=a;i++)
{
for (int j=;j< && j<=b;j++)
{
for (int k=;k< && k<=c;k++)
{
if (i+j+k>n) continue;
if ((j+k*)%!=r) continue;
if ((n-i-j-k)%) continue;
int t=(a-i)/+(b-j)/+(c-k)/;
if (*t>=n-i-j-k) return true;
}
}
}
return false;
} int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout); int T,n,K; scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&K);
scanf("%s",s+);
K=n-K;
if (K==)
{
bool flag=false;
for (int i=;i<=n;i++) if ((s[i]-'')%==) flag=true;
puts(flag? "yes":"no");
continue;
}
suf[n+][]=suf[n+][]=suf[n+][]=;
for (int i=n;i>=;i--)
{
suf[i][]=suf[i+][];
suf[i][]=suf[i+][];
suf[i][]=suf[i+][];
suf[i][(s[i]-'')%]++;
}
bool flag=false;
for (int i=;i<=n;i++)
{
if (s[i]=='') continue;
int a=suf[i+][],b=suf[i+][],c=suf[i+][]; int r=(s[i]-'')%,need=r==? :-r;
if (Check(a,b,c,need,K-)) flag=true;
}
puts(flag? "yes":"no");
} return ;
}
C:
由26个小写字母组成长度为n的字符串, 定义一次变化后 字母i会变成a[i], 问一个随机的字符串 变换成自身的期望次数。
题解:
首先求出置换环, 因为总共才26个字母,置换环不同的大小最多有6种(1+2+3+4+5+6<26 1+2+3+4+5+6+7>26)。
设字母i变换fi次变成自身,fi就是它所在置换环大小。
一个串变成自身所需的次数就是串内所有字母的fi的最小公倍数。
所以可以枚举串内有哪些fi, 最多$2^6$ 种情况。
对于当前枚举的特定的fi集合S, 可以用容斥原理来计算总的次数, 即枚举哪些fi没被用上, 用二项式定理容易证明 两次枚举的复杂度一共是$3^6$
具体实现看代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
using namespace std; #define X first
#define Y second
#define N 100010
#define M 11 typedef long long ll;
const int Mod=;
const int INF=<<; char s[];
int cnt[],a[],b[];
int pw[];
bool vis[]; int Lcm(int x,int y)
{
int lcm=x*y,tmp;
while (y)
{
tmp=x%y;
x=y,y=tmp;
} return lcm/x;
} int Power(int x,int P)
{
if (pw[x]) return pw[x];
int res=,xx=x;
for (;P;P>>=)
{
if (P&) res=1ll*res*x%Mod;
x=1ll*x*x%Mod;
}
return pw[xx]=res;
} int Solve(int len,int n)
{
//for (int i=0;i<n;i++) cout<<i<<" "<<a[i]<<" "<<b[i]<<endl;
int lim=<<n,val,cnt,m,t,res=;
for (int mask1=;mask1<lim;mask1++)
{
val=; t=;
for (int i=;i<n;i++) if (mask1&(<<i)) val=Lcm(val,a[i]),t+=b[i];
cnt=Power(t,len);
for (int mask2=(mask1-)&mask1;mask2;mask2=(mask2-)&mask1)
{
int op=; m=t;
for (int j=;j<n;j++) if (mask2&(<<j)) op=-op,m-=b[j];
cnt+=op*Power(m,len); cnt%=Mod;
} res+=1ll*cnt*val%Mod; res%=Mod;
}
return res<? res+Mod:res;
} int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout); int T,len; scanf("%d",&T);
while (T--)
{
scanf("%d%s",&len,s);
memset(vis,,sizeof(vis));
memset(cnt,,sizeof(cnt));
memset(pw,,sizeof(pw));
for (int i=;i<;i++)
{
if (!vis[i])
{
int c=,x=i;
do
{
c++;
x=s[x]-'a';
vis[x]=true;
}while (x!=i);
cnt[c]+=c;
}
}
int n=;
for (int i=;i<=;i++) if (cnt[i]) a[n]=i,b[n++]=cnt[i];
printf("%d\n",Solve(len,n));
}
return ;
}
BestCoder Round #93 ABC的更多相关文章
- BestCoder Round #93
这么快两天就过去了啊……昨天是April Fool’s Day,但绝对是我过的所有April Fool’s Day里最没意思的一个…… 估计再不写就要忘了……还是写写吧= = 说好7:00到机房,然而 ...
- BestCoder Round #93 比赛记录
机房又迎来了一次BC.大家都沸腾了... BC开场,大家全都瞬间开始 啪啦啪啦啪啦啪啦 都要赶紧水过第一题. 第一题明显直接贪心就好了,用map去重. 本人荣幸地第一个写完,提交 Wa. (崩溃的内心 ...
- 【BestCoder Round #93 1001】MG loves gold
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6019 [题意] 每次选择一段连续的段,使得这一段里面没有重复的元素; 问你最少选多少次; [题解] ...
- 【BestCoder Round #93 1002】MG loves apple
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6020 [题意] 给你一个长度为n的数字,然后让你删掉k个数字,问你有没有删数方案使得剩下的N-K个 ...
- 【BestCoder Round #93 1004】MG loves set
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6022 [题意] 让你求一个集合的子集数目; 这个子集有要求; 即: 它所有元素的平方的和小于它所有 ...
- bestcoder Round #7 前三题题解
BestCoder Round #7 Start Time : 2014-08-31 19:00:00 End Time : 2014-08-31 21:00:00Contest Type : ...
- BestCoder Round #11 (Div. 2) 题解
HDOJ5054 Alice and Bob Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- BestCoder Round #11 (Div. 2) 前三题题解
题目链接: huangjing hdu5054 Alice and Bob 思路: 就是(x,y)在两个參考系中的表示演全然一样.那么仅仅可能在这个矩形的中点.. 题目: Alice and Bob ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
随机推荐
- Redis设置使用几号库
Redis中SpringBoot项目中的配置: 1.引入 spring-boot-starter-redis(POM.XML) <dependency> <groupId>or ...
- Queue 队列的用法
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. 以下实例演示了队 ...
- mac上虚拟机:VMWare Fusion, VirtualBox, Parallels Desktop, CrossOver, Veertu
作者:Louis Tong链接:https://www.zhihu.com/question/35731328/answer/66127970来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.1.安装并配置ASM驱动
3.1.安装并配置ASM驱动 3.3.1.检查内核 [root@linuxrac2 etc]# uname -r 2.6.18-164.el5 下载以下rpm包(注意rpm包版本和Linux内核版本一 ...
- 使用webpack构建本地服务器
想不想让你的浏览器监听你的代码的修改,并自动刷新显示修改后的结果,其实Webpack提供一个可选的本地开发服务器,这个本地服务器基于node.js构建,可以实现你想要的这些功能,不过它是一个单独的组件 ...
- JavaScriptCore全面解析 (上篇)
收录待用,修改转载已取得腾讯云授权 作者 | 殷源 编辑 | 迷鹿 殷源,专注移动客户端开发,微软Imagine Cup中国区特等奖获得者,现就职于腾讯. JavaScript越来越多地出现在我们客户 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何设置PLC的扫描周期,运行周期
双击PlcTask,然后再Cycle ticks中可以修改PLC的扫描周期,例如修改为2ms 为了验证是否真的是2ms,可以在程序中跟计数器绑定使用,PLC2ms扫描一次,计数器也是每个周期增加0 ...
- 【Dos】Dos命令大全
dos命令大全 AT 计划在计算机上运行的命令和程序.ATTRIB 显示或更改文件属性.BREAK 设置或清除扩展式 CTRL+C 检查.CACLS 显示或修改文件的访问控制列表(ACLs).CALL ...
- PNP管理器简析--基于ReactOS0.33
CSDN上转悠了一圈发现关于PNP管理的文章不多.那就由我献个丑,记录自己对PNP管理器的看法. pnp管理器被描写叙述为向内核和应用程序提供关于设备拔插的通知,凭感觉,pnp管理器应该是个线程函数等 ...
- 我也来谈谈使用Zen Coding快速开发html和css原理
zen coding 是一种仿css选择器的语法来快速开发html和css的开源项目.现已更名为Emmet.可以到github上下载拜读.在这个都想偷懒的世界里,此方法可以极大的缩短开发人员的开发时间 ...