题意

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. 关于CSS中的字体尺寸设置 em rem等

    常用单位 在CSS中可以用很多不同的方式来设定字体的尺寸.一般来说,这些单位被分成两大类:绝对单位(absolute)和相对单位(relative). 绝对单位在大多数情况下是相对于某些实际量度而言的 ...

  2. HOJ 1640 Mobile Phone

    题意:有一个n*n的矩阵,op==1时,在(x,y)增加值z,op==2时,求以(x1,y1)和(x2,y2)构成的矩阵的和. 思路:二维线段树. 代码: #include<stdio.h> ...

  3. android:ToolBar详解(手把手教程)

    今年(2014) 的 google i/o 发表令多数人为之一亮的 material design,而 google 也从「google i/o 2014」 开始,大家也陆陆续续地看到其更新的 and ...

  4. 3016 质子撞击炮 II

    3016 质子撞击炮 II  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description [抱歉数据错误~~已修 ...

  5. web前端性能意义、关注重点、测试方案、优化技巧

    1.前段性能的意义 对于访问一个网站,最花费时间的并不是后端应用程序处理以及数据库等消耗的时间,而是前端花费的时间(包括请求.网络传输.页面加载.渲染等).根据web优化的黄金法则: 80%的最终用户 ...

  6. http状态码代表含义

    状态代码 状态信息 含义 100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.(HTTP 1.1新) 101 Switching Protocols 服务器将遵从客户的请求转 ...

  7. LeetCode-Decode String

    Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...

  8. IOS开发之—— model最原始的封装,MJExtension加入工程(后续model都继承于它)

    DMBasicDataModel.h #import <Foundation/Foundation.h> @interface DMBasicDataModel : NSObject - ...

  9. Opencv Linux环境搭建

    注:此篇博客最后没有在linux搭建成功Opencv,请移步:http://blog.csdn.net/tanhngbo/article/details/40403885 来查看成功的搭建. 另外,这 ...

  10. 错误C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型

    第一种方法: AfxMessageBox( "Simple   message   box. ");如果先定义一个CString   变量,再赋值就没问题CString   sTe ...