[模拟]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中.有 ...
随机推荐
- 生成 网站“面包屑” XML
using System; using System.Collections.Generic; using System.IO; using System.Threading; using Syste ...
- 安全接口 interface --显示实现接口
前言:当我们定义接口的成员的时候不需要写访问控制符,因为它是默认public的,也只能是public.当一个类要实现这个接口的时候,自然要公开其成员.一直以来我都这么做. interface Inte ...
- 多进程之间的互斥信号量实现(Linux和windows跨平台)
多线程之间实现互斥操作方式很多种,临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),事件(Event)等方式 其中临界区,互斥量,信号量算是严格意义的实现 ...
- mysql---用户管理
#创建用户king , 登陆密码为1234 create user 'king' identified by '1234'; #查看创建用户的语句,即上面那条创建用户的语句 show grants f ...
- Cassandra1.2文档学习(15)—— 配置数据一致性
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_config ...
- WordPress 模板常用函数
WordPress 基本模板文件 一套完整的 WordPress 模板应至少具有如下文件: style.css : CSS(样式表)文件 index.php : 主页模板 archive.php : ...
- 【DELPHI】线程相关
//准备让线程调用的测试函数 procedure Draw(aCanvas: TCanvas; X,Y: Integer; aCount: Integer = 100000); var i: Inte ...
- phpcmsV9中表单向导在js调用里日期控件在IE下报Calendar未定义的解决办法
最近在phpcmsV9里用表单向导弄个的提交表单,但用了日期和时间类型时,用 <script language='javascript' src='{APP_PATH}index.php?m ...
- @Html.TextBox 的使用
@Html.TextBox( }); //限制 text 的最大输入字符数为 10个 @Html.TextBox("users","",new {@class= ...
- Catalyst揭秘 Day6 Physical plan解析
Catalyst揭秘 Day6 Physical plan解析 物理计划是Spark和Sparksql相对比而言的,因为SparkSql是在Spark core上的一个抽象,物理化就是变成RDD,是S ...