CCF-CSP题解 201912-3 化学方程式
判断化学方程式是否配平。
字符串处理。
有点编译原理递归下降法的感觉。
考场源码,比较粗糙。
// INFO BEGIN
//
// User = 201911513451(陶杨)
// Group = C/C++
// Problem = 化学方程式
// Language = CPP11
// SubmitTime = 2019-12-15 16:20:32
//
// INFO END
#include <cstdio>
#include <cstring>
using namespace std;
char str[1005];
int nums[27][27];
void elementSingle(int l, int r, int left, int coef, int coef2) {
if (l > r) return;
int e1, e2 = 0;
e1 = str[l] - 'A' + 1; // [1,26]
if (l < r && !(str[l + 1] >= '0' && str[l + 1] <= '9')) e2 = str[l + 1] - 'a' + 1;
int mid = l + 1;
if (e2 != 0) ++mid;
int co = 0;
while (mid <= r) co = co * 10 + str[mid++] - '0';
if (co == 0) co = 1;
nums[e1][e2] += left * coef * coef2 * co;
}
void element(int l, int r, int left, int coef, int coef2) {
if (l > r) return;
// printf("%d %d %d ", left, coef, coef2);
// for (int i = l; i <= r; ++i) printf("%c", str[i]); printf("\n");
int mid = l + 1;
for (; mid <= r && !(str[mid] >= 'A' && str[mid] <= 'Z'); ++mid);
if (mid <= r) {
elementSingle(l, mid - 1, left, coef, coef2);
element(mid, r, left, coef, coef2);
} else elementSingle(l, r, left, coef, coef2);
}
void formula(int l, int r, int left, int coef, int coef2) {
if (l > r) return;
int lb = -1, rb = -1, lmore = 0;
for (int i = l; i <= r; ++i) {
if (str[i] == '(') {
++lmore;
if (lb == -1) lb = i;
}
if (str[i] == ')') {
--lmore;
if (lmore == 0 && rb == -1) rb = i;
}
if (rb != -1) break;
}
if (rb == -1) element(l, r, left, coef, coef2); else {
int co = 0, mid = rb + 1;
for (; mid <= r && str[mid] >= '0' && str[mid] <= '9'; ++mid) co = co * 10 + str[mid] - '0';
if (co == 0) co = 1;
element(l, lb - 1, left, coef, coef2);
formula(lb + 1, rb - 1, left, coef, coef2 * co);
formula(mid, r, left, coef, coef2);
}
}
void exprSingle(int l, int r, int left) {
if (l > r) return;
int coef = 0, mid = l;
for (; mid <= r && str[mid] >= '0' && str[mid] <= '9'; ++mid) coef = coef * 10 + str[mid] - '0';
if (coef == 0) coef = 1;
formula(mid, r, left, coef, 1);
}
void expr(int l, int r, int left) {
if (l > r) return;
int mid = l;
for (; mid <= r && str[mid] != '+'; ++mid);
if (mid <= r) {
exprSingle(l, mid - 1, left);
expr(mid + 1, r, left);
} else exprSingle(l, r, left);
}
// [l,r]
void equation(int l, int r) {
if (l > r) return;
int mid = l;
for (; str[mid] != '='; ++mid);
expr(l, mid - 1, 1);
expr(mid + 1, r, -1);
}
int main() {
int n;
scanf("%d", &n);
for (int _ = 0; _ < n; ++_) {
scanf("%s", str);
memset(nums, 0, sizeof(nums));
equation(0, strlen(str) - 1);
bool flag = true;
for (int i = 1; i <= 26; ++i) {
for (int j = 0; j <= 26; ++j) {
if (nums[i][j] != 0)
flag = false;
}
}
if (flag) printf("Y\n");
else printf("N\n");
}
return 0;
}
CCF-CSP题解 201912-3 化学方程式的更多相关文章
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- CCF CSP 201312-3 最大的矩形
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...
- CCF CSP 201609-3 炉石传说
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...
- CCF CSP 201403-3 命令行选项
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
- CCF CSP 201409-3 字符串匹配
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...
- CCF CSP 201503-3 节日
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...
- CCF CSP 201509-2 日期计算
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-2 日期计算 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? ...
- CCF CSP 201604-2 俄罗斯方块
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201604-2 俄罗斯方块 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游 ...
- CCF CSP 201512-2 消除类游戏
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...
随机推荐
- 你必须知道的容器日志 (2) 开源日志管理方案 ELK
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...
- 理解Redis的反应堆模式
1. Redis的网络模型 Redis基于Reactor模式(反应堆模式)开发了自己的网络模型,形成了一个完备的基于IO复用的事件驱动服务器,但是不由得浮现几个问题: 为什么要使用Reactor模式呢 ...
- 2019-9-25:渗透测试,基础学习,medusa爆破学习
Medusa(美杜莎)暴力破解使用 该文章仅供学习,利用方法来自网络文章,仅供参考 一.简介 medusa(美杜莎)是一个速度快,支持大规模并行,模块化,爆破登陆,可以同时对多个主机,用户或是密码执行 ...
- cnpm镜像安装
npm install -g cnpm --registry=https://registry.npm.taobao.org
- leetcode105 从前序与中序遍历序列构造二叉树
如何遍历一棵树 有两种通用的遍历树的策略: 宽度优先搜索(BFS) 我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到. 深度优先搜索(DFS) 在这个策略中,我们采用深度 ...
- 打算写一个《重学Node.js》系列,希望大家多多支持
先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...
- 【计算机网络】你真的了解HTTP(HTTPS)协议的这12个知识点吗
HTTP协议 1. 介绍一下OSI七层参考模型和TCP/IP五层模型 1.1 OSI七层模型 1.2 TCP/IP五层模型 1.3 各层的设备 [各层设备] 1.4 各层对应协议 2. HTTP协议和 ...
- Linux服务和systemctl详解
定义 A Linux service is an application (or set of applications) that runs in the background waiting to ...
- altium designer 20.0.8
altium designer 20.0.8 download : http://dl3.downloadly.ir/Files/Software/Altium_Designer_20.0.8_Bet ...
- mysql配置允许外界连接
1.在mysql的安装目录下找到mysql.ini 找到bind-address=127.0.0.1 ,(有的有,有的没有) 改为 bind-address = 0.0.0.0 2.登录mysql客户 ...