题目大意

一个长度为n的字符串s,只包含+和×。

选出一个子序列,然后你有一个ret,初始为0,按顺序扫你选出的这个子序列。

如果碰到的是+,ret+1,否则ret*2。

最大化ret%2^k。

  首先可以注意到,每一个+对答案有2^c的贡献,c为该+后的×数量(因为遇到了×每次乘二)。

 从这个结论推广开来,可以得到×+++=+×+这样一个性质(前者每个+的贡献为2^0=1,总和为3,后者第一个加号的贡献为2^1=2,第二个+的贡献为2^0=1,总和也为3)。

  有了以上两种结论,我们可以把任意一个大于2的+序列从中抽取两个+,又前面的离他最近的一个×前添加一个+。循环多次,就可以使得每一个+序列的长度不超过2。

  建立一个a[],a[i]表示后面×的数量为i的+有多少个,这样来存取每个+的贡献。依第三段的结论可以推出,a[i]<=2因此在二进制运算中,最多只能进一次位。

点击查看代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int maxn=1000000+10;
char s[maxn];
int a[maxn],ans[maxn];
int i,j,k,l,t,n,m,p;
int main(){
scanf("%d%d",&n,&k);
scanf("%s",s+1);
t=0;
fd(i,n,1)
if (s[i]=='*') t++;else a[t]++;
n+=10;
fo(i,0,n){
t=(a[i]-1)/2;
a[i]-=2*t;
a[i+1]+=t;
}//将多个加号组成的串转化成最多只有两个连续加号组成的串
p=k-1;
while (n>=0){
while (n>=0&&!a[n]) n--;
if (n<0) break;
if (n>=p) ans[p--]=1;
else{
fo(i,0,p-1){
t=a[i]/2;
a[i]-=2*t;
a[i+1]+=t;
}
fo(i,0,p) ans[i]=a[i];
break;
}
n--;
}
p=k-1;
while (p>=0&&!ans[p]) p--;
if (p>=0){
fd(i,p,0) printf("%d",ans[i]);
printf("\n");
}
else printf("0\n");
}

最新文章

  1. struts2 如何实现mvc 的?
  2. [原创] 用两个queue实现stack的功能
  3. studio-引入外来包
  4. php spl
  5. 【二分答案nlogn/标解O(n)】【UVA1121】Subsequence
  6. css实现遮罩层,父div透明,子div不透明
  7. JavaScript笔记之第五天
  8. 201521123077 《Java程序设计》第5周学习总结
  9. MySQL 如何使用索引 较为详细的分析和例子
  10. 开机进入grub命令行之后。。。。
  11. iOS开发基础-KVC简单介绍
  12. ASP.NET MVC WebAPI Put和Delete请求出现405(Method not allowed)错误
  13. RBAC权限管理及使用原生PHP实现
  14. db2执行计划介绍
  15. 简单选择排序(Simple Selection Sort)
  16. [转帖]SAP MES生产执行系统解决方案
  17. C语言学习记录_2019.02.09
  18. 优化--前端(全占课,未完成作业:);CDN; Http/2的设置(未完成)
  19. oracle锁表问题解决
  20. MySQL(多表的表记录的查询)

热门文章

  1. 操作系统深度研究(75页PPT)
  2. Web安全学习笔记 SQL注入上
  3. 大陆出境海缆TPE APCN NCP APG简介
  4. # k8s-jenkins在kubernetes中持续部署
  5. unity---点击事件
  6. 使用pdfcrack &amp; crunch暴力破解PDF密码
  7. 二叉树遍历在Unity中的实现
  8. java继承中关于super关键字和this关键字的使用
  9. 常用排序算法(一)-java实现
  10. Solon 1.8.3 发布,云原生微服务开发框架