假·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);
}
}

浙公网安备 33010602011771号