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;
}
posted @   HappyBobb  阅读(21)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示