题意:给了一坨...按题目意思输出就好了...

给一组案例

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的更多相关文章

  1. Monkey Patch/Monkey Testing/Duck Typing/Duck Test

    Monkey Patch Monkey Testing Duck Typing Duck Test

  2. 什么是“鸭子类型(duck typing)”?

    在计算机编程世界里会接触到一个知识点 —— duck typing,叫“鸭子类型”.   它有一个形象的解释: “当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子. ...

  3. 鸭子类型duck typing(动态)

    在程序设计中,鸭子类型(duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于由Ja ...

  4. Python 中的Duck Typing

    在学习Python的时候发现了鸭 子类型这个术语,听起来好像很有意思一样,所以把它记下来. 鸭子类型(Duck Typing)的名字来源于"鸭子测试": "当看到一只鸟走 ...

  5. 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 ...

  6. duck typing

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决 ...

  7. 【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 ...

  8. 鸭子类型(Duck Typing)

    鸭子类型(Duck Typing) 动态类型.没有类型检验.不关注类型,关注方法 相当于静态类型语言的多态 这是程序设计中的一种类型推断风格,这种风格适用于动态语言(比如PHP.Python.Ruby ...

  9. 什么是鸭子类型(duck typing)

    "当看到一仅仅鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这仅仅鸟就能够被称为鸭子." 我们并不关心对象是什么类型,究竟是不是鸭子,仅仅关心行为. 比方在python中.有 ...

随机推荐

  1. VirtualDesktop与Desktops多窗口程序的对比

    在Linux系统下,有着原生的虚拟桌面程序,windows下面则没有提供. windows相对linux好的就是其良好的生态圈. Virtual Desktop类似linux的虚拟桌面程序,可以支持多 ...

  2. (转)MSSQL 各个发行版本版本号以及Compact 版本号

    终于开始写博客了. 不要笑啊. 下面是MSSQL 的发行版本以及版本号.自己整理的. http://support.microsoft.com/kb/321185/zh-cn SQL Server 2 ...

  3. C++ 宽字符(wchar_t)与窄字符(char)的转换

    了解 长度 宽字符wchar_t的长度16位,可以用来显示中文等除英文外的其他文字, 窄字符    char   的长度  8 位,只能处理英文. 哪里可以见到 在VS2010, 2012, 2013 ...

  4. 创建ID3D11Device可能会遇到的问题,不能使用具体的IDXGIAdapter

    要使用具体硬件的显示适配器创建D3D11必须把driverTypes设为D3D_DRIVER_TYPE_UNKNOWN 如下 // 创建D3D11设备 HRESULT hr = D3D11Create ...

  5. PHP 魔术方法 __isset __unset (三)

    慢慢长寻夜,明月高空挂 __isset()  - 在对类中属性或者非类中属性使用isset()方法的时候如果没有或者非公有属性,则自动执行__isset()的方法 __unset() - 在对类中属性 ...

  6. DTCMS自定义标签:获取所有栏目以及不显示指定栏目

    DTcms.Web.UI\Label\category.cs中 添加下面代码 /// <summary> /// 返回所有类别 /// </summary> /// <r ...

  7. 【SQLite】使用事务处理带参数的插入

    using (SQLiteConnection conn = new SQLiteConnection(String.Format("Data Source={0};Pooling=true ...

  8. Clone table header and set as the first element, and replace header's th with td

    Clone table header and replace header's th with td var tableHeaderRow = '#tableId tbody tr:nth-child ...

  9. Android Google购买PHP服务器端验证(订阅购买和一次性购买)

    一.订阅购买验证 android端采用google service account进行校验 1.打开https://cloud.google.com/console创建一个project: 2.打开p ...

  10. 非关系型数据库SequoiaDB虚拟机下应用初探

    SequoiaDB是广州巨杉软件有限公司开发的一款新型分布式非关系型数据库.可应用于linux操作系统下.在虚拟机下试用了一下(操作系统Ubuntu),感觉不错,操控简单易上手,在此分享一下心得. 下 ...