【ZOJ 3480】Duck Typing

题意

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处理

  1 #include<cstdio>
  2 #include<cstring>
  3 
  4 struct cla
  5 {
  6     char name[50];
  7     int mnum;//num of method
  8     char md[50][50];//method
  9     int super;
 10 } a[10050];
 11 void read(char c,int &flag,char name[][50])
 12 {
 13     int k=0;
 14     int len=0;
 15     int cnt=0;
 16     flag=1;
 17     if (c=='b' ||c=='e') flag=0;//begin/end
 18     while((c=getchar())&&c!='
')
 19     {
 20         cnt++;
 21         if (cnt==1 && flag)
 22         {
 23             if (c=='e') flag=2;
 24             else if (c=='a') flag=3;
 25             else if (c=='n') flag=4;
 26         }
 27         if (flag==1 && cnt>5 ||//class ClassName
 28                 flag==2 && cnt>3 ||//def ClassName.Method
 29                 flag==3 && cnt>4 ||//undef ClassName.Method
 30                 flag==4 && cnt>5 ||//call ClassName.Method
 31                 flag==5 )//class Sub:Super
 32         {
 33             name[k][len]=c;
 34             if (c==':')
 35             {
 36                 name[k][len]='';
 37                 len=-1;
 38                 k=1;
 39                 flag=5;
 40             }
 41             if (c=='.')
 42             {
 43                 name[k][len]='';
 44                 len=-1;
 45                 k=1;
 46             }
 47             len++;
 48         }
 49     }
 50 }
 51 
 52 int check(int flag,int &mp,int &fp,char name[][50],int cnum)
 53 {
 54     int defined1=0,defined2=0;
 55     int i,j;
 56 
 57     for(i=1; i<=cnum; i++)
 58         if (strcmp(a[i].name,name[0])==0)
 59             defined1= i;
 60     if (flag==1)
 61     {
 62         if(defined1) return -1;
 63         return 0;
 64     }
 65     if (flag==5)
 66     {
 67         if(defined1) return -1;
 68         else
 69         {
 70             for(i=1; i<=cnum; i++)
 71                 if(strcmp(a[i].name,name[1])==0)
 72                     defined1= i;
 73             if (defined1==0) return -1;
 74             return defined1;
 75         }
 76     }
 77     if (!defined1) return -1;
 78 
 79     int f=defined1,ok=0;
 80     while(f!=0&&!ok)
 81     {
 82         for(j=1; j<=a[f].mnum; j++)
 83         {
 84             if (strcmp(a[f].md[j],name[1])==0)
 85             {
 86                 defined2=j;
 87                 ok=1;
 88             }
 89         }
 90         mp=defined2;
 91         fp=f;
 92         if(flag==3)f=a[f].super;
 93         else f=0;
 94     }
 95 
 96     if (flag==2)
 97     {
 98         if (defined2) return -2;
 99     }
100     else if (!defined2) return -1;
101     return defined1;
102 }
103 
104 void work(int flag,int p,int mp,int fp,char name[][50],int &cnum)
105 {
106     if(flag==1)
107     {
108         cnum++;
109         strcpy(a[cnum].name,name[0]);
110         a[cnum].super=0;
111         printf("class %s
",name[0]);
112     }
113     else if(flag==2)
114     {
115         if(p==-2)
116         {
117             printf("redef %s.%s
",name[0],name[1]);
118         }
119         else
120         {
121             strcpy(a[p].md[++a[p].mnum],name[1]);
122             printf("def %s.%s
",a[p].name,name[1]);
123         }
124     }
125     else if(flag==3)
126     {
127         printf("invoke %s.%s
",a[fp].name,name[1]);
128     }
129     else if(flag==4)
130     {
131         memset(a[fp].md[mp],0,sizeof(a[fp].md[mp]));
132         printf("undef %s.%s
",name[0],name[1]);
133     }
134     else if(flag==5)
135     {
136         cnum++;
137         strcpy(a[cnum].name,name[0]);
138         a[cnum].super=p;
139         printf("class %s:%s
",name[0],name[1]);
140     }
141 }
142 int main()
143 {
144     int t;
145     scanf("%d ",&t);
146     while(t--)
147     {
148         int cnum=0;
149         int flag;
150         
151         //mp 是该方法在该类型的方法里是第几个
152         //fp 是该方法的所属的类型是第几个 
153         int mp,fp;
154         char c;
155         memset(a,0,sizeof(a));
156         while(~(c=getchar())&&c!='
')
157         {
158             char name[2][50]= {"",""};
159             read(c,flag,name);
160             if(flag)
161             {
162                 int p=check(flag,mp,fp,name,cnum);
163                 if(p==-1)
164                     printf("oops!
");
165                 else
166                     work(flag,p,mp,fp,name,cnum);
167             }
168         }
169         printf("
");
170     }
171     return 0;
172 }

string处理

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <map>
  4 #include <string>
  5 
  6 using namespace std;
  7 
  8 int main()
  9 {
 10     map<string,string>fa;
 11     map<string,int>cla;
 12     map<string,int>me;
 13     string s,first,cName,m,cm,super;
 14     int t;
 15     cin>>t;
 16     while (t)
 17     {
 18         cin>>s;
 19         if (s=="begin")
 20         {
 21             cla.clear();
 22             fa.clear();
 23             me.clear();
 24         }
 25         else if (s=="end")
 26         {
 27             t--;
 28             cout<<"
";
 29         }
 30         else if (s=="class")
 31         {
 32             cin>>first;
 33             int i=first.find(':');
 34             if (i==string::npos)
 35             {
 36                 if (cla[first])
 37                     cout<<"oops!
";
 38                 else
 39                 {
 40                     cla[first]=1;
 41                     cout<<s<<" "<<first<<"
";
 42                 }
 43             }
 44             else
 45             {
 46                 super=first.substr(i+1);
 47                 first=first.erase(i);
 48                 if (cla[super]==1 && cla[first]==0)
 49                 {
 50                     cla[first]=1;
 51                     fa[first]=super;
 52                     cout<<s<<" "<<first<<":"<<super<<"
";
 53                 }
 54                 else
 55                     cout<<"oops!
";
 56             }
 57         }
 58         else if (s=="def")
 59         {
 60             cin>>first;
 61             cName=first.substr(0,first.find('.'));//sub str before .
 62             if (cla[cName]==0)
 63                 cout<<"oops!
";
 64             else
 65             {
 66                 if (me[first]==1)
 67                     cout<<"redef "<<first<<"
";
 68                 else
 69                 {
 70                     me[first]=1;
 71                     cout<<s<<" "<<first<<"
";
 72                 }
 73             }
 74         }
 75         else if (s=="undef")
 76         {
 77             cin>>first;
 78             if (me[first]==0)
 79                 cout<<"oops!
";
 80             else
 81             {
 82                 me[first]=0;
 83                 cout<<s<<" "<<first<<"
";
 84             }
 85         }
 86         else if (s=="call")
 87         {
 88             cin>>first;
 89             m=first.substr(first.find('.'));
 90             cName=first.substr(0,first.find('.'));
 91             cm=first;
 92             while(me[cm]==0 && (!cName.empty()))
 93             {
 94                 cm=fa[cName]+m;
 95                 cName=fa[cName];
 96             }
 97             if (cName.empty())
 98                 cout<<"oops!
";
 99             else
100                 cout<<"invoke "<<cm<<"
";
101         }
102     }
103     return 0;
104 }
原文地址:https://www.cnblogs.com/flipped/p/5198629.html