题解 P2366 【yyy2015c01的IDE之Watches】

· · 题解

P2366

这道题的算法十分明显:字符串+模拟

这道题难度不高,坑点几乎没有,居然是黄题

Before AC

这道题可以拆分成三个部分,

1、输入

这道题最好的输入库其实是<stdio.h>, 因为其中的scanf()函数自带的Negated Scanset(黑名单字符集)功能是真的香。

输入迎刃而解。

char cx[32];
char cy[32];
scanf("%[^=]=%[^;];\n", cx, cy);
string a = cx;
string b = cy;

2、字符串处理和变量赋值

大致的字符串处理过程就是 1. 判断B表达式是一个数字类型还是变量名类型 2. 若B表达式是和的形式,拆分取值求和。若B表达式是变量名类型,还需取值 3. 将A存入数据结构 PS:$<map>$是存储【变量标识符 - 变量值】键值对的理想数据结构 ### 3、按照变量标识符的字典序输出 存一个$string$ 类型的数组,用来记录已有的变量名。 $<algorithm>$ 自带sort函数,自写cmp。 ```cpp bool cmp(string a, string b){ return a < b; } ``` $For$循环输出不解释。 ------------ 代码: ```cpp // By Sublime Text 3 // P2366, by Okimoto // No copy, pls. #include <stdio.h> // 标准输入输出 #include <map> // STL大法好b( ̄▽ ̄)d  #include <string> // 用string是因为string自带定义大小排序 #include <algorithm> // Sort using namespace std; int n; map <string, int> mp; // 存输入的信息和数 string ans[128]; // 存储已输入的变量标识符 + 字典序排序 int ptr = 0; // ans的末尾下标记录变量,同时也是ans的长度 bool cmp(string a, string b){ return a < b; // 字典序 } int main(int argc, char const *argv[]){ mp.insert(mp.begin(), pair<string, int>("__NULL__", 0)); // 对于a = b + c的代码处理a = b的情况时,将c假定成0 scanf("%d\n", &n); // 输入n for(int i = 0; i < n; ++ i){ char aa[32]; char bb[32]; scanf("%[^=]=", aa); // 输入直到遇见‘=’为止,顺便刷掉‘=’字符 string a = aa; scanf("%[^;];\n", bb); // 刷掉‘;’ + 刷掉换行符 string b = bb; if('0' <= b[0] && b[0] <= '9'){ // 若b变量是个数字类型的 int sum = 0; // ‘+’字符之前的数 int tmp = 0; // ‘+’字符之后的数 int j; // 取sum for(j = 0; j < (int)b.size() && b[j] != '+'; j ++){ sum *= 10; sum += b[j] - '0'; } // 取tmp for(j = j + 1; j < (int)b.size(); j ++){ tmp *= 10; tmp += b[j] - '0'; } sum += tmp; if(mp.end() == mp.find(a)){ // 若a变量还未在mp中 ans[ptr ++] = a; // ans记录a mp.insert(mp.begin(), pair<string, int>(a, sum)); // 将a推入mp } else mp[a] = sum; // 否则,将a的值改变 } else{ // b变量是个变量类型的 string x; // ‘+’字符之前的变量名 string y; // ‘+’字符之后的变量名 bool yFlg = true; // 判断是否没有‘+’以后的变量 int j; // 取x for(j = 0; j < (int)b.size() && b[j] != '+'; j ++) x += b[j]; // 取y for(j = j + 1; j < (int)b.size(); j ++){ yFlg = false; y += b[j]; } if(yFlg) y = "__NULL__"; // 取数 int sum = mp[x] + mp[y]; //同理 if(mp.end() == mp.find(a)){ ans[ptr ++] = a; mp.insert(mp.end(), pair<string, int>(a, sum)); } else mp[a] = sum; } } // 字典序排序 sort(ans, ans + ptr, cmp); // 输出 for(int i = 0; i < ptr; i ++) printf("%s %d\n", ans[i].c_str(), mp[ans[i]]); return 0; } // 谢谢大家阅读这篇题解,(づ ̄3 ̄)づ╭❤~ ```