题意

1.有t组数据,输入时每组数据之间空格隔开,输出时也要求空格隔开。

2.每组都是一行begin开始,一行end结束。

3.class ClassName[:Super] 表示声明一个类型,Super值存在时,说明它继承Super类型。

4.def ClassName.Method 表示声明ClassName类型的一个方法。

5.undef ClassName.Method 表示删除该类型下该方法。

6.call ClassName.Method 表示调用该方法,如果该类型本身没有该方法,就去看它祖先是否有。

分析

可以用字符串string的函数处理,也可以用char处理(我写的姿势不是很好看,手动捂脸)。

说几个容易错的地方:。。其实姿势不同,会错的地方也不同。最口怕的是我WA在了把“oops"拼写成"opps"了QAQ。还有比如”.“不要写成”:“了!

代码

char处理

 #include<cstdio>
#include<cstring> struct cla
{
char name[];
int mnum;//num of method
char md[][];//method
int super;
} a[];
void read(char c,int &flag,char name[][])
{
int k=;
int len=;
int cnt=;
flag=;
if (c=='b' ||c=='e') flag=;//begin/end
while((c=getchar())&&c!='\n')
{
cnt++;
if (cnt== && flag)
{
if (c=='e') flag=;
else if (c=='a') flag=;
else if (c=='n') flag=;
}
if (flag== && cnt> ||//class ClassName
flag== && cnt> ||//def ClassName.Method
flag== && cnt> ||//undef ClassName.Method
flag== && cnt> ||//call ClassName.Method
flag== )//class Sub:Super
{
name[k][len]=c;
if (c==':')
{
name[k][len]='\0';
len=-;
k=;
flag=;
}
if (c=='.')
{
name[k][len]='\0';
len=-;
k=;
}
len++;
}
}
} int check(int flag,int &mp,int &fp,char name[][],int cnum)
{
int defined1=,defined2=;
int i,j; for(i=; i<=cnum; i++)
if (strcmp(a[i].name,name[])==)
defined1= i;
if (flag==)
{
if(defined1) return -;
return ;
}
if (flag==)
{
if(defined1) return -;
else
{
for(i=; i<=cnum; i++)
if(strcmp(a[i].name,name[])==)
defined1= i;
if (defined1==) return -;
return defined1;
}
}
if (!defined1) return -; int f=defined1,ok=;
while(f!=&&!ok)
{
for(j=; j<=a[f].mnum; j++)
{
if (strcmp(a[f].md[j],name[])==)
{
defined2=j;
ok=;
}
}
mp=defined2;
fp=f;
if(flag==)f=a[f].super;
else f=;
} if (flag==)
{
if (defined2) return -;
}
else if (!defined2) return -;
return defined1;
} void work(int flag,int p,int mp,int fp,char name[][],int &cnum)
{
if(flag==)
{
cnum++;
strcpy(a[cnum].name,name[]);
a[cnum].super=;
printf("class %s\n",name[]);
}
else if(flag==)
{
if(p==-)
{
printf("redef %s.%s\n",name[],name[]);
}
else
{
strcpy(a[p].md[++a[p].mnum],name[]);
printf("def %s.%s\n",a[p].name,name[]);
}
}
else if(flag==)
{
printf("invoke %s.%s\n",a[fp].name,name[]);
}
else if(flag==)
{
memset(a[fp].md[mp],,sizeof(a[fp].md[mp]));
printf("undef %s.%s\n",name[],name[]);
}
else if(flag==)
{
cnum++;
strcpy(a[cnum].name,name[]);
a[cnum].super=p;
printf("class %s:%s\n",name[],name[]);
}
}
int main()
{
int t;
scanf("%d ",&t);
while(t--)
{
int cnum=;
int flag; //mp 是该方法在该类型的方法里是第几个
//fp 是该方法的所属的类型是第几个
int mp,fp;
char c;
memset(a,,sizeof(a));
while(~(c=getchar())&&c!='\n')
{
char name[][]= {"",""};
read(c,flag,name);
if(flag)
{
int p=check(flag,mp,fp,name,cnum);
if(p==-)
printf("oops!\n");
else
work(flag,p,mp,fp,name,cnum);
}
}
printf("\n");
}
return ;
}

string处理

 #include <iostream>
#include <cstdio>
#include <map>
#include <string> using namespace std; int main()
{
map<string,string>fa;
map<string,int>cla;
map<string,int>me;
string s,first,cName,m,cm,super;
int t;
cin>>t;
while (t)
{
cin>>s;
if (s=="begin")
{
cla.clear();
fa.clear();
me.clear();
}
else if (s=="end")
{
t--;
cout<<"\n";
}
else if (s=="class")
{
cin>>first;
int i=first.find(':');
if (i==string::npos)
{
if (cla[first])
cout<<"oops!\n";
else
{
cla[first]=;
cout<<s<<" "<<first<<"\n";
}
}
else
{
super=first.substr(i+);
first=first.erase(i);
if (cla[super]== && cla[first]==)
{
cla[first]=;
fa[first]=super;
cout<<s<<" "<<first<<":"<<super<<"\n";
}
else
cout<<"oops!\n";
}
}
else if (s=="def")
{
cin>>first;
cName=first.substr(,first.find('.'));//sub str before .
if (cla[cName]==)
cout<<"oops!\n";
else
{
if (me[first]==)
cout<<"redef "<<first<<"\n";
else
{
me[first]=;
cout<<s<<" "<<first<<"\n";
}
}
}
else if (s=="undef")
{
cin>>first;
if (me[first]==)
cout<<"oops!\n";
else
{
me[first]=;
cout<<s<<" "<<first<<"\n";
}
}
else if (s=="call")
{
cin>>first;
m=first.substr(first.find('.'));
cName=first.substr(,first.find('.'));
cm=first;
while(me[cm]== && (!cName.empty()))
{
cm=fa[cName]+m;
cName=fa[cName];
}
if (cName.empty())
cout<<"oops!\n";
else
cout<<"invoke "<<cm<<"\n";
}
}
return ;
}

【ZOJ 3480】Duck Typing的更多相关文章

  1. 【ZOJ 4070】Function and Function

    [链接] 我是链接,点我呀:) [题意] [题解] 递归一会. 会发现最后肯定是0,1一直循环. 开始循环之后就直接返回结果就好. [代码] #include <bits/stdc++.h> ...

  2. 【ZOJ 4060】Flippy Sequence

    [链接] 我是链接,点我呀:) [题意] [题解] 按照两个区间的排列方式 我们可以分成以下几种情况 会发现这两个区间的作用 最多只能把两段连续不同的区间变为相同. 那么写个for处理出连续不相同的一 ...

  3. 【ZOJ 4067】Books

    [链接] 我是链接,点我呀:) [题意] [题解] 统计a中0的个数cnt0 然后m减去cnt0 因为这cnt0个0是一定会取到的. 如果m==0了 那么直接找到数组中的最小值mi 输出mi-1就好 ...

  4. 【ZOJ 4062】Plants vs. Zombies

    [链接] 我是链接,点我呀:) [题意] [题解] 二分最后的最大抵御值mid. 然后对于每个蘑菇. 都能算出来它要浇水几次mid/ai 然后如果第i个蘑菇没浇水达到要求次数. 就在i和i+1之间来回 ...

  5. 【Zoj 4061】Magic Multiplication

    [链接] 我是链接,点我呀:) [题意] [题解] /* for a[1] from 1~9 1*1=1 2*1=2 3*1=3 1*2=2 2*2=4 3*2=6 1*3=3 2*3=6 3*3=9 ...

  6. 【ZOJ 3200】Police and Thief

    ZOJ 3200 首先我写了个高斯消元,但是消出来了一些奇怪的东西,我就放弃了... 然后只好考虑dp:\(dp[i][j][k]\)表示走到了第i步,到了\((j,k)\)这个节点的概率. 那么答案 ...

  7. 【ZOJ 3463】Piano

    ZOJ 3463 题意:有一个钢琴,一个人把左手放在L位置上,右手放在R位置上,要弹某\(n\)个键,每个手最多能够得着9个位置,并且两只手不能交叉.把手移动的代价是大拇指移动的距离的平方根.问弹完这 ...

  8. 【ZOJ 3929】Deque and Balls(普通dp)

    题意:给出一个序列,按照顺序一个一个放入双端队列(可以放在头部也可以放在尾部),一个队列的美丽指数就是数列中a[i]>a[i+1]的个数,求美丽指数的期望*2^n的值. 解题思路:方便起见,我们 ...

  9. 【ZOJ 3844】Easy Task

    题意 每次把序列中最大的数a的一个和最小的数b的一个变成a-b.求最后是否能使序列里的数全部相同,能则输出这个相同的数. 分析 一定是有解的,不断减少最大数的个数,最大数减少为0个时,就是减少了不同数 ...

随机推荐

  1. jquery/js实现验证聚焦,失焦

    jquery实现验证聚焦,失焦方法: 我还是喜欢用jquery来实现,不管页面中多少个输入框需要实现聚焦,失焦,都公有,我常用的方法是: 遍历该页面中的input框,获取输入框中的val值,当该输入框 ...

  2. Debian安装中文输入法

    简单暴力: apt-get install ibus-pinyin 你也可以通过GUI下面到Synaptic Package Manager里面选中ibus-pinyin进行安装 安装完成后重启计算机 ...

  3. 第23章 SEH结构化异常处理(1)_系统SEH机制

    23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制: ...

  4. JetBrain WebStorm 注册码

    webStorm : UserName:William ===== LICENSE BEGIN ===== 45550-12042010 00001SzFN0n1bPII7FnAxnt0DDOPJA ...

  5. 怎么解决Android studio导入项目卡死

    在使用Android studio的时候常常遇到这样的问题,从github或是其他地方导入项目,Android studio呈现卡死的现象!当遇到这种情况时,可以看看是下面那种情况,在按照方法来解决! ...

  6. jquery堆栈与队列

    期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待

  7. Page Security

    参见开发文档 Overview This document describes how to build applications that grant selected access to indi ...

  8. JS 模板引擎之JST模板

    项目中有用到JST模板引擎,于是抽个时间出来,整理了下关于JST模板引擎的相关内容. 试想一个场景,当点击页面上列表的翻页按钮后,通过异步请求获得下一页的列表数据并在页面上显示出来.传统的JS做法是编 ...

  9. Java系列: 关于LinkedList的 ListIterator的add和remove

    static void testListIteratorAdd(){ LinkedList<String> strList = new LinkedList<String>() ...

  10. 创建Maven工程

    一.Maven工程创建 File->New->Other,进入: 点击Next,进入: 勾选上Create a simple project(不使用骨架) 点击Next,进入: 输入项目名 ...