CF200D解题报告

发布时间 2023-12-02 14:21:15作者: CCF_IOI

CF200D 解题报告

题意

给你 \(n\) 个函数,由函数类型函数名参数类型组成。

给你 \(m\) 个变量,由变量类型变量名组成。

给你 \(k\) 个调用关系,由调用的函数名参数名构成。

参数类型变量类型保证为 intdoublestringT 中的一个,其中 T 表示可以匹配任意类型。

分析

很明显,这是一道大模拟,可以先将函数给存储下来,变量名所对应的类型存储下来,最后调用的时候在判断符不符合就好了。

函数可以先将所有符号变成空格,然后使用 vector 将这个函数的每一项存进去,最后塞入一个大的 vector 进行存储。

变量直接使用一个 map 进行映射操作就好了。

查询时将调用函数按上面函数的处理方式处理后跟存储下来的函数进行比较,如果有相同就记录一次。

最后输出答案就切了一道绿题。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

int n, m, k;
string s, a, b;
map<string, string> variable_type;//变量名所对应的变量类型
vector<vector<string>> function_type;//储存所有函数,内部的存的是每一个函数的参数类型

bool check(vector<string> a, vector<string> b){//判断是否能对的上,a是函数,b是调用
	if (a.size() - 1 != b.size()) return false;//长度
	if (a[1] != b[0]) return false;//判断函数名
	for (int i = 1; i < b.size(); i++){
		if (a[i + 1] != "T" && a[i + 1] != variable_type[b[i]]) return false;//类型
	}
	return true;
}

signed main(){
	scanf("%lld\n", &n);
	for (int i = 1; i <= n; i++){
		getline(cin, s);
		vector<string> name;
		for (char &c : s) if (c == '(' || c == ')' || c == ',') c = ' ';
		istringstream ss(s);//自动分离空格
		while (ss >> s) name.push_back(s);//将分离后的每一个字符串放入
		function_type.push_back(name);//将每一个函数放入
	} 
	scanf("%lld\n", &m);
	for (int i = 1; i <= m; i++){
		cin >> a >> b;
		variable_type[b] = a;//将变量名和类型对应起来
	}
	scanf("%lld\n", &k);
	for (int i = 1; i <= k; i++){
		int cnt = 0;
		getline(cin, s);
		vector <string> name;
		for (char &c : s) if (c == '(' || c == ')' || c == ',') c = ' ';
		istringstream ss(s);
		while (ss >> s) name.push_back(s);//同上,分离空格
		for (int j = 0; j < n; j++){
			if (check(function_type[j], name)) cnt++;
		}
		printf("%lld\n", cnt);
	}
	return 0;
}