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. I/O多路转接-epoll

    By francis_hao    Aug 5,2017   APUE讲多路转接的章节介绍了select.pselect和poll函数.而epoll是linux内核在2.5.44引入的.在glibc ...

  2. C语言指针大杂烩

    By francis_hao Oct 31,2016 指针数组和数组指针 指针数组本身是个数组,数组的内容是指针.形如char *pa[].由于[]优先级高于*,pa先于[]结合表示pa是一个数组,p ...

  3. debounce 与 throttle 区别

    原文地址:http://undefinedblog.com/debounce-and-throttle/ 二.什么是debounce    1. 定义 如果用手指一直按住一个弹簧,它将不会弹起直到你松 ...

  4. Ubuntu修改grub启动顺序和启动时间

    sudo gedit /boot/grub/grub.cfg,输入密码,在弹出的文件中找到set default = "0",想要改为第N项默认就把0改成N-1 看到启动界面是第几 ...

  5. CSS属性中cursor:hand

    在 IE 下设置鼠标为手型的方法: cursor: hand,但是在 FIREFOX 中是无效的,解决方法是在FIREFOX中设置: cursor: pointer. 而这个pointer 值在IE和 ...

  6. P3076 [USACO13FEB]出租车Taxi

    题目描述 Bessie is running a taxi service for the other cows on the farm. The cows have been gathering a ...

  7. 【poj3734】矩阵乘法

    题解: 若当前有i个格子.2个是偶数的方案数为a[i]1个是偶数的方案数为b[i]0个是偶数的方案数为c[i] a[i+1]=2*a[i](i+1染成黄或蓝)+b[i](把奇数变为偶数)b[i+1]= ...

  8. bzoj2811 [Apio2012]Guard

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2811 [题解] 首先我们先把没看到忍者的段去掉,可以用线段树做. 如果剩下的就是K,那么特判 ...

  9. 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数

    一.利用Modal形式展示控制器 1.如何展示// vc就是要展示的新控制器[self presentViewController:vc animated:YES completion:^{    N ...

  10. poj 1528 Perfection

    题目链接:http://poj.org/problem?id=1528 题目大意:输入一个数n,然后求出约数的和sum,在与这一个数n进行比较,如果sum>n,则输出ABUNDANT,如果sum ...