[模拟]ZOJ3480 Duck Typing
题意:给了一坨...按题目意思输出就好了...
给一组案例
begin
class d
class c:d
class b:c
class a:b
def d.m
def d.n
call a.m
end
答案应该是
class dclass c:dclass b:cclass a:b
def d.m
def d.n
invoke d.m
建立的类应该是这样的
a:b:c:d
d有method m和n
那么call a、b、c的n、m时都应invoke d的
map<string, bool> mp_class, mp_method;
map<string, string> mp_super[];
map<string, int> s_num;
bool dfs(string name, string method)
{
if(mp_method[name+"."+method])
{
printf("invoke ");
cout<<name<<"."<<method<<endl;
return true;
}
for(int i=;i<s_num[name];i++)
if(dfs(mp_super[i][name], method))
return true;
return false;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
getchar();
char s[];
mp_class.clear();
mp_method.clear();
s_num.clear();
while(gets(s))
{
if(s[]=='b')
continue;
if(s[]=='e')
break;
int n=strlen(s);
if(s[]=='c' && s[]=='l') // class
{
int i;
for(i=;i<n;i++)
if(s[i]==':')
break;
if(i==n) // ding yi
{
string name="";
for(int j=;j<n;j++)
name+=s[j];
if(mp_class[name]==)
{
mp_class[name]=;
puts(s);
}
else
puts("oops!");
}
else
{
string name="", super="";
for(int j=;j<i;j++)
name+=s[j];
for(int j=i+;j<n;j++)
super+=s[j];
if(mp_class[name] || !mp_class[super])
puts("oops!");
else
{
mp_class[name]=;
mp_super[s_num[name]++][name]=super;
puts(s);
}
}
}
else if(s[]=='d') // def
{
int i;
for(i=;i<n;i++)
if(s[i]=='.')
break;
string name="";
for(int j=;j<i;j++)
name+=s[j];
string method=name+".";
for(int j=i+;j<n;j++)
method+=s[j];
if(!mp_class[name])
puts("oops!");
else if(mp_method[method])
{
printf("redef ");
cout<<method<<endl;
}
else
{
mp_method[method]=;
printf("def ");
cout<<method<<endl;
}
}
else if(s[]=='u') // undef
{
string name="";
for(int i=;i<n;i++)
name+=s[i];
if(!mp_method[name])
puts("oops!");
else
{
printf("undef ");
cout<<name<<endl;
mp_method[name]=;
}
}
else // call
{
int i;
for(i=;i<n;i++)
if(s[i]=='.')
break;
string na="";
for(int j=;j<i;j++) // class
na+=s[j];
string name="";
for(int j=i+;j<n;j++) // method
name+=s[j];
if(mp_method[na+"."+name])
{
printf("invoke ");
cout<<na<<"."<<name<<endl;
continue;
}
if(!dfs(na, name))
puts("oops!");
// bool flag=0;
// string cur=na;
// while(s_num[na])
// {
// for(int k=0;k<s_num[na];k++)
// if(mp_method[mp_super[k][na]+"."+name])
// {
// printf("invoke ");
// cout<<mp_super[k][na]<<"."<<name<<endl;
// flag=1;
// break;
// }
// }
// if(!flag)
// puts("oops!");
}
}
puts("");
}
return ;
}
ZOJ 3480
[模拟]ZOJ3480 Duck Typing的更多相关文章
- Monkey Patch/Monkey Testing/Duck Typing/Duck Test
Monkey Patch Monkey Testing Duck Typing Duck Test
- 什么是“鸭子类型(duck typing)”?
在计算机编程世界里会接触到一个知识点 —— duck typing,叫“鸭子类型”. 它有一个形象的解释: “当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子. ...
- 鸭子类型duck typing(动态)
在程序设计中,鸭子类型(duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于由Ja ...
- Python 中的Duck Typing
在学习Python的时候发现了鸭 子类型这个术语,听起来好像很有意思一样,所以把它记下来. 鸭子类型(Duck Typing)的名字来源于"鸭子测试": "当看到一只鸟走 ...
- this inspection detects names that should resolved but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are sup
输入第一行代码:import logging;logging.basicConfig(level==logging.INFO) 提示:this inspection detects names tha ...
- duck typing
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决 ...
- 【PyCharm编辑器】之无法导入引用手动新建的包或类,报:This inspection detects names that should resolve but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases.
一.现象描述 如下图所示,手动新建个类包calculator.py,想在test.py文件引用它,发现一直报红线,引用失败 Unresolved reference 'calculator' less ...
- 鸭子类型(Duck Typing)
鸭子类型(Duck Typing) 动态类型.没有类型检验.不关注类型,关注方法 相当于静态类型语言的多态 这是程序设计中的一种类型推断风格,这种风格适用于动态语言(比如PHP.Python.Ruby ...
- 什么是鸭子类型(duck typing)
"当看到一仅仅鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这仅仅鸟就能够被称为鸭子." 我们并不关心对象是什么类型,究竟是不是鸭子,仅仅关心行为. 比方在python中.有 ...
随机推荐
- 利用js来实现一些常用的算法
示例代码中的arr指的是给出的数组,s指的是数组的起始坐标0,end指的是数组的最后一个坐标arr.length-1,n指的是要查找的数字 查找某个值: 1.线性法 function findInAr ...
- GSM嗅探
GSM初探 大家应该都听说过HTTP协议,又听说WEB服务,每一个服务的背后都有一个协议在工作着.所谓的没有规矩不成方圆,说的就是这个道理,每一个细小的部分,都已经规定好,只要按照协议执行,就不会出现 ...
- 第一个C++
输入:cin>>(相当于scanf) #include <iostream> using namespace std; int main() { int number; ...
- Java抓取网页数据
http://ayang1588.github.io/blog/2013/04/08/catchdata/ 最近处于离职状态,正赶清闲,开始着手自己的毕业设计,课题定的是JavaWeb购物平台,打算用 ...
- 基础学习总结(三)--文本、SD卡数据读写
简单的文本数据写入文件不需要权限,读写SD卡在4.0版本前需要写权限.在4.0后需要读写权限 布局: <LinearLayout xmlns:android="http://schem ...
- 基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
基于css3新属性transform,实现3d立方体的旋转 通过原生JS,点击事件,鼠标按下.鼠标抬起和鼠标移动事件,实现3d立方体的拖动旋转,并将旋转角度实时的反应至界面上显示 实现原理:通过获取鼠 ...
- IE6/IE7中li底部4px的Bug
当li的子元素中有浮动(float)时,IE6/IE7中<li>元素的下面会产生4px空隙的bug. XHTML <ul class="list"> < ...
- php代码加密|PHP源码加密——实现方法
Encipher - PHP代码加密 | PHP源码加密下载地址:https://github.com/uniqid/encipher 该加密程序是用PHP代码写的,加密后代码无需任何附加扩展,无需安 ...
- Catalyst揭秘 Day8 Final 外部数据源和缓存系统
Catalyst揭秘 Day8 Final 外部数据源和缓存系统 今天是Catalyst部分的收官,主要讲一些杂项内容. 外部数据源处理 什么叫外部数据源,是SparkSql自己支持的一些文件格式,以 ...
- Spark Streaming揭秘 Day14 State状态管理
Spark Streaming揭秘 Day14 State状态管理 今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作.State是SparkStreaming ...