链接:https://codeforces.com/contest/200/problem/D
难度:*1800
标签:binary search
brute force
expression parsing
implementation
题目大意
给你
n
n
n 个 void
类型函数,参数 只写数据类型,不写参数变量名,如 void orz (int, double, string,string )
,可能存在多余空格;再给你
m
m
m 个变量,先给变量类型,再给变量名;最后调用
k
k
k 个函数,问:对于调用的每个函数(互不影响),在上述
n
n
n 个函数中有几个和当前函数相关?
变量类型:包含int
double
string
,另外,在那
n
n
n 个函数中有一种类型 T
,意思是适用于每一种类型。
如果还是不懂去原题看一下样例基本就能懂。
题解
首先考虑没有多余空格的情况,只要记录 n n n 个函数中每个的变量类型,那么如何简便的存储?
对于每个函数,都把每一个类型变成一个数字,如 int
变为
1
1
1,double
变为
2
2
2,string
变为
3
3
3 ,T
变为
0
0
0,最后拼接起来
如:void orz (int, double, string,string )
最终就变成了 orz
--> 1233
,切记是字符串类型,方便操作。
可以想到用 map<string,string> func
去映射每个函数名对应的类型。
但是会包含重名的情况,如void f(int,T)
和 void f(T,T)
,所以不难想到使用 map<string,vector<string>> func
这样一个 key 就能对应多个 value。
Note:记得输入用getline(cin,___)
,再用一个新的字符串,去除原字符串的空格就行了。
其次处理后面 m m m 个变量,由于没有特殊符号,所以直接输入两个字符串即可。
同样使用上面的方法,将变量类型转换为数字,存入一个 map<string,string> vari
中即可。
最后处理
k
k
k 个调用的函数,整行读入,去除空格后找到函数名name
,直接一个一个去fun[name]
中一个一个去比对,就 OK 了。
C++代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,k;
string _;
map<string,vector<string> > func;//用于存储函数类型
map<string,string> vari;//用于存储变量类型
int main(){
cin>>n;
getline(cin,_);//由于下一次getline()函数会把当前行剩余的换行符读取,所以要先用一个临时字符串将这行剩余的内容读取(换行符和空格),防止错位
while(n--){
string s;
getline(cin,s);
string t="";
for(int i=0;i<s.length();i++){
if(s[i]==' '){
continue;
}
if(s.substr(i,4)=="void"){
i+=3;
continue;
}
t+=s[i];
}
string ans="",name="";
int brac=-1;
for(int i=0;i<t.length();i++){
if(t[i]=='('){
brac=i;
break;
}
}
name=t.substr(0,brac);
for(int i=brac+1;i<t.length();i++){
if(t.substr(i,3)=="int"){
ans+="1";
i+=2;
}else if(t.substr(i,6)=="double"){
ans+="2";
i+=5;
}else if(t.substr(i,6)=="string"){
ans+="3";
i+=5;
}else if(t[i]=='T'){
ans+="0";
}
}
func[name].push_back(ans);
}
cin>>m;
while(m--){
string s,t;
cin>>s>>t;
if(s=="int"){
vari[t]="1";
}else if(s=="double"){
vari[t]="2";
}else if(s=="string"){
vari[t]="3";
}
}
cin>>k;
getline(cin,_);//用途同上
while(k--){
string s;
getline(cin,s);
string t="";
for(int i=0;i<s.length();i++){
if(s[i]!=' '){
t+=s[i];
}
}
int brac=-1;
for(int i=0;i<t.length();i++){
if(t[i]=='('){
brac=i;
break;
}
}
int last=brac+1;
string name=t.substr(0,brac);
string res="";
for(int i=brac+1;i<t.length();i++){
if(t[i]==','||t[i]==')'){
res+=vari[t.substr(last,i-last)];
last=i+1;
}
}
ll ans=0;
for(int i=0;i<func[name].size();i++){
bool flag=true;
if(func[name][i].length()!=res.length()) continue;
for(int j=0;j<func[name][i].length();j++){
if(res[j]==func[name][i][j]||func[name][i][j]=='0'){
continue;
}
flag=false;
break;
}
if(flag){
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}