[模拟]ZOJ3480 Duck Typing

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

给一组案例

100
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的

 

  1 map<string, bool> mp_class, mp_method;
  2 map<string, string> mp_super[100005];
  3 map<string, int> s_num;
  4 bool dfs(string name, string method)
  5 {
  6     if(mp_method[name+"."+method])
  7     {
  8         printf("invoke ");
  9         cout<<name<<"."<<method<<endl;
 10         return true;
 11     }
 12     for(int i=0;i<s_num[name];i++)
 13         if(dfs(mp_super[i][name], method))
 14             return true;
 15     return false;
 16 }
 17 int main()
 18 {
 19     int t;
 20     scanf("%d", &t);
 21     while(t--)
 22     {
 23         getchar();
 24         char s[10005];
 25         mp_class.clear();
 26         mp_method.clear();
 27         s_num.clear();
 28         while(gets(s))
 29         {
 30             if(s[0]=='b')
 31                 continue;
 32             if(s[0]=='e')
 33                 break;
 34             int n=strlen(s);
 35             if(s[0]=='c' && s[1]=='l')   // class
 36             {
 37                 int i;
 38                 for(i=6;i<n;i++)
 39                     if(s[i]==':')
 40                         break;
 41                 if(i==n)           // ding yi
 42                 {
 43                     string name="";
 44                     for(int j=6;j<n;j++)
 45                         name+=s[j];
 46                     if(mp_class[name]==0)
 47                     {
 48                         mp_class[name]=1;
 49                         puts(s);
 50                     }
 51                     else
 52                         puts("oops!");
 53                 }
 54                 else
 55                 {
 56                     string name="", super="";
 57                     for(int j=6;j<i;j++)
 58                         name+=s[j];
 59                     for(int j=i+1;j<n;j++)
 60                         super+=s[j];
 61                     if(mp_class[name] || !mp_class[super])
 62                         puts("oops!");
 63                     else
 64                     {
 65                         mp_class[name]=1;
 66                         mp_super[s_num[name]++][name]=super;
 67                         puts(s);
 68                     }
 69                 }
 70             }
 71             else if(s[0]=='d')  // def
 72             {
 73                 int i;
 74                 for(i=0;i<n;i++)
 75                     if(s[i]=='.')
 76                         break;
 77                 string name="";
 78                 for(int j=4;j<i;j++)
 79                     name+=s[j];
 80                 string method=name+".";
 81                 for(int j=i+1;j<n;j++)
 82                     method+=s[j];
 83                 if(!mp_class[name])
 84                     puts("oops!");
 85                 else if(mp_method[method])
 86                 {
 87                     printf("redef ");
 88                     cout<<method<<endl;
 89                 }
 90                 else
 91                 {
 92                     mp_method[method]=1;
 93                     printf("def ");
 94                     cout<<method<<endl;
 95                 }
 96             }
 97             else if(s[0]=='u')  // undef
 98             {
 99                 string name="";
100                 for(int i=6;i<n;i++)
101                     name+=s[i];
102                 if(!mp_method[name])
103                     puts("oops!");
104                 else
105                 {
106                     printf("undef ");
107                     cout<<name<<endl;
108                     mp_method[name]=0;
109                 }
110             }
111             else                // call
112             {
113                 int i;
114                 for(i=5;i<n;i++)
115                     if(s[i]=='.')
116                         break;
117                 string na="";
118                 for(int j=5;j<i;j++)   // class
119                     na+=s[j];
120                 string name="";
121                 for(int j=i+1;j<n;j++)  // method
122                     name+=s[j];
123                 if(mp_method[na+"."+name])
124                 {
125                     printf("invoke ");
126                     cout<<na<<"."<<name<<endl;
127                     continue;
128                 }
129                 if(!dfs(na, name))
130                     puts("oops!");
131 //                bool flag=0;
132 //                string cur=na;
133 //                while(s_num[na])
134 //                {
135 //                    for(int k=0;k<s_num[na];k++)
136 //                        if(mp_method[mp_super[k][na]+"."+name])
137 //                        {
138 //                            printf("invoke ");
139 //                            cout<<mp_super[k][na]<<"."<<name<<endl;
140 //                            flag=1;
141 //                            break;
142 //                        }
143 //                }
144 //                if(!flag)
145 //                    puts("oops!");
146             }
147         }
148         puts("");
149     }
150     return 0;
151 }
ZOJ 3480

 

转载于:https://www.cnblogs.com/Empress/p/4391884.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值