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的更多相关文章

  1. Codeforces 7E - Defining Macros 题解

    目录 Codeforces 7E - Defining Macros 题解 前言 做法 程序 结尾 Codeforces 7E - Defining Macros 题解 前言 开始使用博客园了,很想写 ...

  2. Codeforces

    Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...

  3. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

  4. Google C++ 代码规范

    Google C++ Style Guide   Table of Contents Header Files Self-contained Headers The #define Guard For ...

  5. 个人作业-Week 2 代码复审

    一.概要部分 1.代码能符合需求和规格说明么? 经过我自己的测试和助教的检测,他的代码符合需求和规格的说明. 2.代码设计是否有周全的考虑? 这里代码设计我们是从两个方面检查的: 对方处理控制台输入的 ...

  6. 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 ...

  7. Zend API:深入 PHP 内核

    Introduction Those who know don't talk. Those who talk don't know. Sometimes, PHP "as is" ...

  8. 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 ...

  9. Codeforces 593B Anton and Lines

    LINK time limit per test 1 second memory limit per test 256 megabytes input standard input output st ...

随机推荐

  1. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  2. spring中Constructor、@Autowired、@PostConstruct的顺序【转】

    其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入.所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入 ...

  3. 在xml文件中引入带有@Configuration的Java类

    在xml引入带有@Configuration的Java类,就是把这个带有@Configuration的Java类,当做一个普通的的类用<bean>标签引入: 核心代码如下: @Config ...

  4. 测试数据库DG搭建为正式库以后做准备

    Data guard 部署 1.系统准备(备库只需建立数据库软件) 两台操作系统 oracle linux 7 Node1 172.16.70.191 Node2 172.16.70.192 Orac ...

  5. 帮助小伙伴写的组装xml字符串类

    import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.uti ...

  6. Cpython解释器支持的线程

    因为Python解释器帮你自动定期进行内存回收,你可以理解为python解释器里有一个独立的线程,每过一段时间它起wake up做一次全局轮询看看哪些内存数据是可以被清空的,此时你自己的程序 里的线程 ...

  7. python实战===一行代码就能搞定的事情!

    打印9*9乘法表: >>> print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) ...

  8. 利用cron监视后台进程状态

    利用cron监视后台进程状态 http://blog.csdn.net/dyx810601/article/details/72967758 1. 利用cron监视后台进程状态,如果进程死掉或服务器重 ...

  9. 该配置节不能包含 CDATA 或文本元素

    当执行程序时报“该配置节不能包含 CDATA 或文本元素” ,有可能是你的web.config中有异常的文本节点,比如

  10. Java坦克大战 (七) 之图片版

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...