【题目】E. Logical Expression

【题意】令x=11110000(2),y=11001100(2),z=10101010(2),n次询问,每次要求用[与][或][非][括号]构成含至多各1个xyz的表达式使得结果等于给定的数字(0~255),要求表达式最短(一样短时字典序最小)。n<=10000

【算法】数学+最短路?

【题解】实际上给的数字只有256种情况,所以思路是先预处理再直接回答询问。

对每个表达式我们只关心其结果和最后进行的运算符优先级,所以至多有3*256种状态,令n=3*256。

关于优先级,定义三层优先级,最高F为!和(),次高T为&,最低E为|,表达式的优先级为其最后计算的符号的优先级,低优先级遇到高优先级需要打括号

令F[i]表示最高优先级结果为i的最短表达式,T[i]和E[i]同理,这三种优先级转移如下:

一、F

1.F[i]=min{ F[i] , "(" + E[i] + ")" }

2.F[i]=min{ F[i] , "!" + F[i^255] }

二、T

1.T[i]=min{ T[i] , F[i] }

2.T[i&j]=min{ T[i&j] , T[i]&T[j] }

三、E

1.E[i]=min{ E[i] , T[i] }

2.E[i&j]=min{ E[i&j] , E[i]&E[j] }

只需要这六种转移,三层优先级就可以实现循环转移,可以运用dijkstra,n个结点,转移连边,复杂度O(n^3)。或直接迭代实现至无法更新结束,复杂度O(n^2)。(复杂度分析不太清楚)

最终答案就是ans=E[x],x为输入。

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std; string f[],t[],e[];
char s[];
int n;
bool cmp(string& a,string& b){return a.size()!=b.size()?a.size()<b.size():a<b;}
bool modify(string& a,string b){return (a==""||cmp(b,a))?a=b,:;}
int main(){
f[]="x";f[]="y";f[]="z";
while(){
bool ok=;
for(int i=;i<;i++)if(e[i]!="")ok|=modify(f[i],"("+e[i]+")");
for(int i=;i<;i++)if(f[i]!="")ok|=modify(f[i^],"!"+f[i]);
for(int i=;i<;i++)if(f[i]!="")ok|=modify(t[i],f[i]);
for(int i=;i<;i++)if(t[i]!="")for(int j=;j<;j++)if(t[j]!="")ok|=modify(t[i&j],t[i]+"&"+t[j]);
for(int i=;i<;i++)if(t[i]!="")ok|=modify(e[i],t[i]);
for(int i=;i<;i++)if(e[i]!="")for(int j=;j<;j++)if(e[j]!="")ok|=modify(e[i|j],e[i]+"|"+e[j]);
if(!ok)break;
}
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s);int c=;
for(int j=;j<;j++)c|=((s[j]-'')<<j);
cout<<e[c]<<endl;
}
return ;
}

【CodeForces】913 E. Logical Expression的更多相关文章

  1. 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP

    [题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...

  2. 【CodeForces】913 D. Too Easy Problems

    [题目]D. Too Easy Problems [题意]给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题数k<=ai时问题有效,求在时限T内选择一些问题解决的最大有效问题数 ...

  3. 【CodeForces】913 C. Party Lemonade

    [题目]C. Party Lemonade [题意]给定n个物品,第i个物品重量为2^(i-1)价值为ci,每个物品可以无限取,求取总重量>=L的最小代价.1<=30<=n,1< ...

  4. 【Codeforces】Round #491 (Div. 2) 总结

    [Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...

  5. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

  6. 【CodeForces】601 D. Acyclic Organic Compounds

    [题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...

  7. 【Codeforces】849D. Rooter's Song

    [算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...

  8. 【CodeForces】983 E. NN country 树上倍增+二维数点

    [题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...

  9. 【CodeForces】925 C.Big Secret 异或

    [题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...

随机推荐

  1. 《DWZ笔记一》<select>动态联动菜单

    联动菜单,即组合框Combo box,在DWZ文档中对组合框combox的是这样描述的: 在传统的select 用class 定义:class=”combox”, html 扩展:保留原有属性name ...

  2. 使用git下载编译erlang

    git clone https://github.com/erlang/otp cd otp git tag git checkout -b OTP- OTP- ./otp_build all exp ...

  3. sublime text 多行代码注释快捷键

    多行选择后按下ctrl+/ 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中 ...

  4. (转)关于ActiveMQ的配置

    目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较.简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统.(对 ...

  5. cat命令和EOF标识输出shell到文件

    在某些场合,可能我们需要在脚本中生成一个临时文件,然后把该文件作为最终文件放入目录中.(可参考ntop.spec文件)这样有几个好处,其中之一就是临时文件不是唯一的,可以通过变量赋值,也可根据不同的判 ...

  6. Linux服务器开启tomcat的gc日志

    压力测试,为了能监控长期对gc的变化的情况,那么就需要在tomcat中进行配置相关的gc输入日志,以便后续来对gc中进行分析 工具 :linux+tomcat 1.进入到了tomcat的bin的目录下 ...

  7. 第184天:js创建对象的几种方式总结

    面向对象编程(OOP)的特点: 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有的对象下继承出新的对象 多态:多对象的不同形态 一.创建对象的几种方式 javascript 创建对象简单 ...

  8. 通过父类定位到子类 先将父类当作一个dom

    通过父类定位到子类 先将父类当作一个dom 在此基础上在定位子类

  9. 【bzoj5146】有趣的概率 微积分

    题目描述 "可爱的妹子就像有理数一样多,但是我们知道的,你在数轴上随便取一个点取到有理数的概率总是0,"芽衣在床上自顾自的说着这句充满哲理的话,"诶,柚子,我写完概率论的 ...

  10. 3.7 TCP拥塞控制

    3.7 TCP拥塞控制 在3.5.5流量控制中有,接收方通过维护一个rwnd来控制流量,本节中考虑三个问题: 第一,  一个TCP发送方如何限制它向其他连接发送流量的速率. 第二,  一个TCP发送方 ...