[模拟]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中.有 ...
随机推荐
- VirtualDesktop与Desktops多窗口程序的对比
在Linux系统下,有着原生的虚拟桌面程序,windows下面则没有提供. windows相对linux好的就是其良好的生态圈. Virtual Desktop类似linux的虚拟桌面程序,可以支持多 ...
- (转)MSSQL 各个发行版本版本号以及Compact 版本号
终于开始写博客了. 不要笑啊. 下面是MSSQL 的发行版本以及版本号.自己整理的. http://support.microsoft.com/kb/321185/zh-cn SQL Server 2 ...
- C++ 宽字符(wchar_t)与窄字符(char)的转换
了解 长度 宽字符wchar_t的长度16位,可以用来显示中文等除英文外的其他文字, 窄字符 char 的长度 8 位,只能处理英文. 哪里可以见到 在VS2010, 2012, 2013 ...
- 创建ID3D11Device可能会遇到的问题,不能使用具体的IDXGIAdapter
要使用具体硬件的显示适配器创建D3D11必须把driverTypes设为D3D_DRIVER_TYPE_UNKNOWN 如下 // 创建D3D11设备 HRESULT hr = D3D11Create ...
- PHP 魔术方法 __isset __unset (三)
慢慢长寻夜,明月高空挂 __isset() - 在对类中属性或者非类中属性使用isset()方法的时候如果没有或者非公有属性,则自动执行__isset()的方法 __unset() - 在对类中属性 ...
- DTCMS自定义标签:获取所有栏目以及不显示指定栏目
DTcms.Web.UI\Label\category.cs中 添加下面代码 /// <summary> /// 返回所有类别 /// </summary> /// <r ...
- 【SQLite】使用事务处理带参数的插入
using (SQLiteConnection conn = new SQLiteConnection(String.Format("Data Source={0};Pooling=true ...
- 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 ...
- Android Google购买PHP服务器端验证(订阅购买和一次性购买)
一.订阅购买验证 android端采用google service account进行校验 1.打开https://cloud.google.com/console创建一个project: 2.打开p ...
- 非关系型数据库SequoiaDB虚拟机下应用初探
SequoiaDB是广州巨杉软件有限公司开发的一款新型分布式非关系型数据库.可应用于linux操作系统下.在虚拟机下试用了一下(操作系统Ubuntu),感觉不错,操控简单易上手,在此分享一下心得. 下 ...