假·CF200D题解

这道题目重点其实在与空格与下标的处理

对于读入的每一个函数和变量,可以通过 \(struct\) 来维护

因为每个函数内参数数量不是固定的,所以用 \(vector\) 来维护

总的来说,这题是一道模拟题,要注意细节

接下来那就直接上代码吧:

#include<bits/stdc++.h>
using namespace std;
struct node{string hs;vector<string> lx;}a[1010];//函数
struct no{string lx,mz;}b[1010];//变量
int n,j,m,t,u,bo,p;
string st,s,c[1010];
int main()
{
	cin>>n;getline(cin,st);//提前用字符串读掉换行
	for(int i=1;i<=n;i++)
	{
		getline(cin,st);j=0;while(st[j]!='d') j++;
		st.erase(0,j+1);j=0;while(st[j]==' ') j++;//去掉void和其前后空格
		while(st[j]!='('&&st[j]!=' ') a[i].hs+=st[j],j++;while(st[j]==' ') j++;j++;
		while(st[j]!=')')
		{
			while(st[j]==' '||st[j]==',') j++;
			switch(st[j])
			{
				case 'i':a[i].lx.push_back("int");j+=3;break;
				case 'T':a[i].lx.push_back("T");j+=1;break;
				case 'd':a[i].lx.push_back("double");j+=6;break;
				case 's':a[i].lx.push_back("string");j+=6;break; 
			}
		}//类型->lx 函数名称->hs
	}
	cin>>m;getline(cin,st);//提前用字符串读掉换行
	for(int i=1;i<=m;i++)
	{
		getline(cin,st);j=0;while(st[j]==' ') j++;
		switch(st[j])
		{
			case 'i':b[i].lx="int";j+=3;break;
			case 'd':b[i].lx="double";j+=6;break;
			case 's':b[i].lx="string";j+=6;break; 
		}//变量类型->lx
		while(st[j]==' ') j++;
		for(int o=j;o<=st.size()-1&&st[o]!=' ';o++) b[i].mz+=st[o];//变量名字->mz
	}
	cin>>t;getline(cin,st);//提前用字符串读掉换行
	for(int i=1;i<=t;i++)
	{
		getline(cin,st);j=0;s="";p=0;u=0;while(st[j]==' ') j++;
		while(st[j]!='('&&st[j]!=' ') s+=st[j],j++;while(st[j]==' ') j++;j++;
		while(st[j]!=')')
		{
			while(st[j]==' '||st[j]==',') j++;if(st[j]==')') break;p++; 
			while(st[j]!=' '&&st[j]!=','&&st[j]!=')') c[p]+=st[j],j++; 
			for(int o=1;o<=m;o++) if(c[p]==b[o].mz) {c[p]=b[o].lx;break;}
		}//储存所有参数以及函数名字
		for(int o=1;o<=n;o++)
		{
			if(p!=a[o].lx.size()||s!=a[o].hs) continue;bo=1;
			for(int oo=0;oo<a[o].lx.size();oo++)
			{
				if(a[o].lx[oo]=="T") continue;
				if(a[o].lx[oo]!=c[oo+1]) {bo=0;break;}
			}//一一进行匹配
			u+=bo;
		}
		for(int o=1;o<=p;o++) c[o]="";
		printf("%d\n",u);
	}
} 

posted @ 2025-05-03 08:36  zhjzhmh  阅读(6)  评论(0)    收藏  举报