[Codeforces 7E] Defining Macros
Link:http://codeforces.com/problemset/problem/7/E
Brief Introduction:一个表达式由多个“Macros”组成,每个Macro都为一个整体,如果最终的表达式使得运算顺序发生改变则称该表达式不安全
给你多个Macros和最终的表达式,询问该表达式是否安全
Algorithm:
要判断最终的表达式是否安全,就是要看其中的每个Macro是否安全,同时每一个运算符是否会使其整个变得不安全
我们发现要判断每个Macro的安全性也要经过同样的过程
从而将原问题化归为了解决多个相同的子问题并最终加合的问题。这样就可以想到利用递归或dp来解决问题
我们可以将每一部分划为4个状态,方便之后状态的加合
0:本身已经不安全
1:该macro在“/”或"-"后不安全
2:该macro仅在"/"后不安全
3:无论何时此皆安全
这样就构建了状态“安全程度”的单调性。判断两表达式加合起来的状态时,仅要判断其是否大于某个安全程度即可
Code:
#include <bits/stdc++.h> using namespace std; int n,len=,w=;
string t;
char s[];
map<string,int> mp; int eval(int l,int r)
{
for(int i=r,w=;i>l;i--)
if(w+=(s[i]==')'),w-=(s[i]=='('),!w&&(s[i]=='-' || s[i]=='+'))
{
int L=eval(l,i-),R=eval(i+,r);
return L&&R&&(s[i]!='-' || R>); //对"-"后的判断为安全程度是否大于1
}
for(int i=r,w=;i>l;i--)
if(w+=(s[i]==')'),w-=(s[i]=='('),!w&&(s[i]=='*' || s[i]=='/'))
{
int L=eval(l,i-),R=eval(i+,r);
return (L>)&&(R>)&&(s[i]!='/' || R>)?:;
}
if(s[l]=='(') //有了括号,就没有1、2状态了
return eval(l+,r-)?:;
string a(s+l,s+r+);
return mp.count(a)?mp[a]:;
} int Get()
{
gets(s);
for(int i=len=;s[i];i++)
if(s[i]!=' ') s[len++]=s[i];
return eval(,len-);
} int main()
{
cin >> n;
for(int i=;i<=n;i++)
{
scanf(" #%*s");cin >> t;
mp[t]=Get();
}
cout << (Get()?"OK":"Suspicious");
return ;
}
Review:
1、字符串读入技巧:
scanf中*s,*d均为省略符号,只读取而不存储
使用gets函数可读取这一行剩下的所有内容
2、对此类包含括号匹配问题的通用技巧:
在循环时用一个变量记录此时括号是否已经匹配,是则进行递归
3、当发现可以将问题变为更小规模分别处理时,使用递归手法,正确将状态分类
4、如果状态种类较多,可以构建状态从“好”到“坏”的单调性从而方便判断
[Codeforces 7E] Defining Macros的更多相关文章
- Codeforces 7E - Defining Macros 题解
目录 Codeforces 7E - Defining Macros 题解 前言 做法 程序 结尾 Codeforces 7E - Defining Macros 题解 前言 开始使用博客园了,很想写 ...
- Codeforces
Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...
- Google C++ Style Guide
Background C++ is one of the main development languages used by many of Google's open-source project ...
- Google C++ 代码规范
Google C++ Style Guide Table of Contents Header Files Self-contained Headers The #define Guard For ...
- 个人作业-Week 2 代码复审
一.概要部分 1.代码能符合需求和规格说明么? 经过我自己的测试和助教的检测,他的代码符合需求和规格的说明. 2.代码设计是否有周全的考虑? 这里代码设计我们是从两个方面检查的: 对方处理控制台输入的 ...
- sys_arch interface for lwIP 2.0.3
sys_arch interface for lwIP 2.0.3 Author: Adam Dunkels Simon Goldschmidt The operating system emulat ...
- Zend API:深入 PHP 内核
Introduction Those who know don't talk. Those who talk don't know. Sometimes, PHP "as is" ...
- Codeforces Round #284 (Div. 2)A B C 模拟 数学
A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces 593B Anton and Lines
LINK time limit per test 1 second memory limit per test 256 megabytes input standard input output st ...
随机推荐
- Why is the ibdata1 file continuously growing in MySQL?
We receive this question about the ibdata1 file in MySQL very often in Percona Support. The panic st ...
- 迅雷Bolt图像拉伸不清晰的解决办法
迅雷Bolt库中的图像拉伸的效果锯齿比较严重,常见的导致锯齿的情况: 1.在使用ImageObject时,drawmode为1拉伸模式下: 2.使用Bitmap类的Stretch函数拉伸图像: 虽然I ...
- 【BZOJ】5028: 小Z的加油店
[算法]数学+线段树/树状数组 [题解] 首先三个操作可以理解为更相减损术或者辗转相除法(待证明),所以就是求区间gcd. 这题的问题在线段树维护gcd只能支持修改成一个数,不支持加一个数. 套路:g ...
- MyBatis系列三 之 使用getMapper剔除掉Dao的实现类
MyBatis系列三 之 使用getMapper剔除掉Dao的实现类 我们在系列一 中 我们使用的是Dao的实现类 来操作底层数据库,今天我们使用getMapper()来替换Dao的实现类, ...
- dd命令测试硬盘I/O速度
[root@bogon ~]# dd if=/dev/zero of=/home/tom.a.txt bs=200MB count=1记录了1+0 的读入记录了1+0 的写出200000000字节(2 ...
- 别再滥用scrapy CrawlSpider中的follow=True
对于刚接触scrapy的同学来说, crawlspider中的rule是比较难理解的, 很可能驾驭不住. 而且笔者在YouTube中看到许多公开的演讲都都错用了follow这一选项, 所以今天就来仔细 ...
- 【bzoj4636】蒟蒻的数列
由于数据范围过大,直接线段树会炸,离散化或者动态开点都行. 打个标记在树上,最后把树dfs一边算一下即可. #include<bits/stdc++.h> #define N 100000 ...
- delphi string,pchar,char的比较
来自:http://blog.163.com/kat_/blog/static/189284269201152513331999/ ---------------------------------- ...
- ionic3 关于屏幕方向问题
关于屏幕方向问题 使用ionic-native中的screen-orientation ionic cordova plugin add cordova-plugin-screen-orientati ...
- Delphi:对TNotifyEvent的理解
type TNotifyEvent = procedure (Sender: TObject) of object; 在Delphi中事件也是一个类,类型就是事件类型,不同的事件属于不同的类.TNot ...