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行 ...
随机推荐
- Nginx下HTTP强制重定向至HTTPS
Nginx下HTTP强制重定向至HTTPS 对于nginx来说,配置http强制重定向至https有多种多样的写法.可以直接rewrite,也可以用301重定向.但是直接拷贝网上的配置往往会出现问题, ...
- ansible on aws linux 2
1. 安装epel yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2. 安 ...
- 【2018寒假集训 Day2】【动态规划】又上锁妖塔
又上锁妖塔 (tower.in/tower.out) [题目描述] 小D在X星买完了想要的东西,在飞往下一个目的地的途中,正无聊的他转头看了看身边的小A,发现小A正在玩<仙剑>,可是小A很 ...
- Python-Re正则表达式库
来源:中国MOOC北京理工大学Python教学团队 链接:https://www.icourse163.org/learn/BIT-1001870001#/learn/content?type=det ...
- HashMap面试题,看这一篇就够了!
目录 序言 一.JDK7中的HashMap底层实现 1.1 基础知识 1.2 put()方法 1.2.1 特殊key值处理 1.2.2 扩容 1.2.3 如何计算bucket下标? 1.2.4 在目标 ...
- 【软件工具】easyExcel简明使用指南
easyExcel简介 Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不发的话可能还行,但是一旦并发上来 ...
- SimpleXML使用详解
SimpleXML使用详解 介绍 SimpleXML提供了一种简单,直观的方法来处理XML.它只有一个单一类型的类,三个函数和六个方法. 使用SimpleXML SimpleXMLElement 类是 ...
- swiper实现一个好看的轮播图
轮播是我们在编写页面中经常遇到的模块,所以网上也会有各种有有关轮播图的插件.今天忽然间看到了swiper上一个高颜值的轮播功能,顺便做一下分享. 首先页面在head内要先引用 swiper的css 和 ...
- 【w、vmstat、top、sar、nload】各个命令 使用介绍
第7周第1次课(5月7日) 课程内容: 10.1 使用w查看系统负载10.2 vmstat命令10.3 top命令10.4 sar命令10.5 nload命令 10.1 使用w查看系统负载 w命令查看 ...
- JPA配置实体时 insertable = false, updatable = false
当使用JPA配置实体时,如果有两个属性(一个是一般属性,一个是多对一的属性)映射到数据库的同一列,就会报错. 这时,在多对一的@JoinColumn注解中添加insertable = false, u ...