[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 ...
随机推荐
- 【ZJ选讲·压缩】
给一个由小写字母组成的字符串(len<=50) 我们可以用一种简单的方法来压缩其中的重复信息. 用M,R两个大写字母表示压缩信息 M标记重复串的开始, R表示后面的一段字符串重复从上一个 ...
- NOIP2010 引水入城 贪心+DFS
我们先把简单的不能搞死,具题意可证:每个蓄水长的管辖区域一定是连续的.证明:既然我们已经能了那么我们就可以说如果这个区间不是连续的那我们取出这个区间中间阻隔开的那一段,那么对于这一整个区间来说水源不可 ...
- win32 application怎么把结果输出到调试窗口
方法1: TCHAR str[]; wsprintf(str, TEXT(); OutputDebugString(TEXT("-------lala------\n")); Ou ...
- Educational Codeforces Round 11 A
A. Co-prime Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) C
C. Little Artem and Matrix time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- MyBatis+Spring实现基本CRUD操作
一.MyBaits介绍 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的X ...
- USACO_1.1_Greedy_Gift_Givers_(模拟+水题)
描述 http://train.usaco.org/usacoprob2?a=y0SKxY0Kc2q&S=gift1 给出不超过$10$个人,每个人拿出一定数量的钱平分给特定的人,求最后每个人 ...
- 一致性hash与CRUSH算法总结
相同之处:都解决了数据缓存系统中数据如何存储与路由. 不同之处:区别在于虚拟节点和物理节点的映射办法不同 由于一般的哈希函数返回一个int(32bit)型的hashCode.因此,可以将该哈希函数能够 ...
- python收集
http://my.oschina.net/mutour/blog/?disp=2&catalog=0&sort=time&p=4 Python 不使用win32api打开任务 ...
- HTML5 拖拽事件
dragstart:拖拽开始 drag: 拖拽中,会不停的触发 dragend:拖拽结束 ondraglevea:有元素离开了本元素 ondragenter:有元素进入了本元素 ondragover: ...