P8289 [省选联考 2022] 预处理器(官方数据)
场外的题解。
这道题确实就是模拟,但是还是有一些细节要注意的。首先你要读懂题目,特别是要找出特殊情况的处理方法,例如:
6
#define p b
#define c z
#define CC p c
CC
#undef p
CC
这个数据应该输出:
b z
p z
这个是需要注意的。
那具体如何模拟呢?我们对目标字符串在空格和任何非字母非数字非下划线处截开,判断每个字符串是否是宏定义,若是,就展开,对展开的字符串继续做这个操作,直到无法操作。
代码(民间和官方都能过):
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <cstring>
#include <string>
using namespace std;
int n;
unordered_map<string, string> mp;
unordered_map<string, bool> f;
inline string change(string& ss)
{
string s(ss), p(""), ans("");
s += " ";
int len(s.size() - 1);
for (register int i = 0; i <= len; i++)
{
if (!isalpha(s[i]) && !isdigit(s[i]) && s[i] != '_')
{
if (mp.count(p) && !f.count(p))
{
f[p] = true;
ans += change(mp[p]);
f.erase(p);
}
else
{
ans += p;
}
ans += s[i];
p = "";
}
else
{
p += s[i];
}
}
ans.pop_back();
return ans;
}
int main()
{
cin >> n;
getchar();
while (n--)
{
string s;
getline(cin, s);
int len(s.size() - 1);
if (s[0] == '#')
{
if (s[1] == 'd')
{
string s1 = "", s2 = "";
for (register int j(8); j <= len; ++j)
{
if (s[j] == ' ')
{
s2 = s.substr(j + 1);
break;
}
s1 += s[j];
}
mp[s1] = s2;
}
else
{
string s1(s.substr(7));
mp.erase(s1);
}
puts("");
}
else
{
cout << change(s) << "\n";
}
}
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!